mysql设置check

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a19990412/article/details/84667821

简述

MySQL中是没有check操作的。但是可以做类似的操作来实现。

方法一

比如说,我有一个表,teacher,我想要设置性别只能选男或者女

在这里插入图片描述

那么就直接将这个改成enum 数据类型

mysql> alter table teacher modify tsex enum('男', '女') default '男';
Query OK, 0 rows affected (0.41 sec)
Records: 0  Duplicates: 0  Warnings: 0

方法二

使用触发器:

比如说我们这里想要挑战一些稍微难点的操作。

比如我们想要设置插入的某一列的数据必须每一位都是必须是数字。

  • 下面我将会下面的teacher表中的id来进行这个操作

在这里插入图片描述

  • 创建一个筛选字符串中是否都是数字的函数
mysql> delimiter $$
mysql> create function IsNum(str varchar(25))
    ->  returns int deterministic
    -> begin
    ->  declare iResult INT DEFAULT 0;
    ->  if ISNULL(str) THEN return 0; END IF;
    ->  if str='' THEN return 0; END IF;
    ->  select str REGEXP '^[0-9]*$' INTO iResult;
    ->  if iResult=1 THEN
    ->     return 1;
    ->  else
    ->     return 0;
    ->  end if;
    -> end $$
Query OK, 0 rows affected (0.07 sec)

测试一下

mysql> select IsNum('12312')$$
+----------------+
| IsNum('12312') |
+----------------+
|              1 |
+----------------+
1 row in set (0.00 sec)
  • 设置好这个函数之后再来设置一下触发器
mysql> delimiter //
mysql> create trigger TC_ID
    -> before update
    -> on teacher
    -> for each row
    -> begin
    -> if (IsNum(new.id) = 0) then
    ->          SIGNAL sqlstate '45001' set message_text = 'No way! You cannot do this!';
    -> end if;
    -> end//
Query OK, 0 rows affected (0.03 sec)

mysql> create trigger TC_ID_Insert
    -> before insert
    -> on teacher
    -> for each row
    -> begin
    -> if (IsNum(new.id) = 0) then
    ->          SIGNAL sqlstate '45001' set message_text = 'No way! You cannot do this!';
    -> end if;
    -> end//
Query OK, 0 rows affected (0.09 sec)

做好上面的触发器之后,以后设置关于teacher的插入和更新都需要被保证了。
我们可以做一下测试

mysql> insert into teacher value('1', 'Sean', '广州', '00000001', '男', '123')//
Query OK, 1 row affected (0.01 sec)

mysql> insert into teacher value('2', '肥宅Sean', '广州', '00000002', '男', 'abc')//
ERROR 1644 (45001): No way! You cannot do this!

第二次插入的时候,由于最后的id变成了abc了,不是全部都是数字,所以就不能插入,报错。

在这里插入图片描述

添加id长度为某些固定的数值

  • 这里设置长度也必须要为15位或者是18位
mysql> create trigger TC_ID_Insert
    -> before insert
    -> on teacher
    -> for each row
    -> begin
    -> if ((length(new.id) != 15 and length(new.id)!= 18) or IsNum(new.id)=0) then
    ->  SIGNAL sqlstate '45001' set message_text = "No way! You cannot do this!";
    -> end if;
    -> end //
Query OK, 0 rows affected (0.09 sec)

mysql> create trigger TC_ID
    -> before update
    -> on teacher
    -> for each row
    -> begin
    -> if ((length(new.id) != 15 and length(new.id)!= 18) or IsNum(new.id)=0) then
    ->   SIGNAL sqlstate '45001' set message_text = "No way! You cannot do this!";
    -> end if;
    -> end //
Query OK, 0 rows affected (0.04 sec)

Hint

关于触发器

【Mysql】trigger触发器(一些实例)

猜你喜欢

转载自blog.csdn.net/a19990412/article/details/84667821