MySQL虽然输入check语句不会报错,但是实际上并没有check的功能。但是MySQL 依然可以利用触发器来实现相应功能。
本文将根据两个例子简要阐述MySQL实现check和assertion的思路。
注意
signal异常处理功能在MySQL5.5版本以后才出现。之前的版本可以选择对相应值进行操作而不是报错。
下文测试所用数据库版本为Server version: 10.1.21-MariaDB Source distribution
check实现
例子1是希望能够对插入表项有约束,例如年龄不能超过60,若大于60则报错,拒绝插入。
对于其他的支持check的数据库,可以用以下语句来实现:
alter table emp add constraint c_age check(age<60);
而利用触发器,则可以写如下语句
delimiter //
create trigger age before insert
on emp for each row
begin
declare msg varchar(200);
if (new.age > 60) then
set msg = "Age is above 60. Cannot insert.";
signal sqlstate 'HY000' SET message_text = msg;
end if;
end //
delimiter ;
(最后记得恢复;为结束标志) 将其保存至1.sql,测试其功能
MariaDB [book5]> source path/to/i