MariaDB 10.1.48版本CHECK约束不生效的问题排查求助
MariaDB 10.1.48版本CHECK约束不生效的问题排查求助
嘿,我之前也碰到过类似的情况,咱们来理清楚这个问题的来龙去脉:
首先先还原下你的场景:
你创建了带CHECK约束的表,要求字段a必须大于b:
CREATE TABLE t1 ( a INT, b INT, CONSTRAINT a_greater CHECK (a>b) );
但插入不符合约束的数据(4,5)时,语句居然能成功执行,这显然和预期不符。
问题根源
这不是bug,而是你使用的MariaDB 10.1.x版本的既定行为!
MariaDB在10.2.1版本之前,对CHECK约束仅做语法层面的兼容——允许你编写CHECK约束的语句,但不会实际强制执行校验逻辑。这个设计主要是为了兼容早期MySQL的行为(MySQL 8.0版本之前也不支持真正生效的CHECK约束)。
解决办法
给你两个可行的方向:
首选方案:升级数据库版本
升级到MariaDB 10.2.1或更高版本,从这个版本开始,CHECK约束会被默认强制执行。升级后你不需要修改原有表结构,再插入(4,5)这类不符合约束的数据时,数据库就会正确拦截并抛出错误。临时替代方案(无法升级时)
如果暂时没法升级,除了你提到的触发器,还可以用存储过程封装插入/更新逻辑来实现校验:DELIMITER // CREATE PROCEDURE insert_t1(IN p_a INT, IN p_b INT) BEGIN IF p_a > p_b THEN INSERT INTO t1(a,b) VALUES(p_a, p_b); ELSE SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'a must be greater than b'; END IF; END // DELIMITER ;之后通过调用存储过程来插入数据:
CALL insert_t1(4,5);,不符合条件时就会抛出错误提示。当然,这个方案需要修改你的数据写入逻辑,不如直接升级来得彻底。
备注:内容来源于stack exchange,提问作者Timo Treichel
相关产品推荐
相关产品推荐

