简述
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
关于触发器