在MySQL 8.0.16以前, CREATE TABLE允许从语法层面输入下列CHECK约束,但实际没有效果:
约束表达式在不同的SQL模式下,可能返回不同的结果另外,在INFORMATION_SCHEMA的CHECK_CONSTRAINTS表中存放着所有表中定义的CHECK约束的信息。
复杂业务场景下的约束,从架构角度看,允许有不同的实现方式:
放在数据库表中,通过约束实现,但不支持子查询
放在数据库中,通过触发器(TRIGGER)实现
放在应用程序的逻辑中,在提前数据库前检查
一般性的,选择不同方式的原则如下:
如果CHECK约束可以实现,且约束比较稳定,一般用CHECK约束实现,比如:年龄不允许为负数,不允许>150等,比如:
如果属于数据库逻辑,比如:审计,外键可以使用触发器
CREATE TRIGGER pid_insert_check
BEFORE INSERT ON department
FOR EACH ROW
BEGIN
IF (NEW.pid <> 0 AND NEW.pid NOT IN (select id from department)) THEN
signal sqlstate ‘45000’
set message_text = ‘department parent id has to be chosen from id’;
END IF;
END
CREATE TRIGGER pid_delete_check
BEFORE DELETE ON department
FOR EACH ROW
BEGIN
IF (OLD.id < 0 OR OLD.id IN (select pid from department)) THEN
signal sqlstate ‘45000’
set message_text = ‘department parent id has to be chosen from id’;
END IF;
END
如果属于业务逻辑,建议放在应用层处理,方便开发者:理解和维护,但是:也需要通过强化业务管理,避免特权用户偶发操作引起对数据完整性的破坏
到此这篇关于Mysql中的CHECK约束特性详解的文章就介绍到这了,更多相关Mysql中CHECK约束内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!