MySQL设置REGEXP正则的CHECK约束后违规INSERT仍可插入是什么原因
MySQL CHECK约束未生效问题原因分析
核心原因可分为两类:
- 原因1:MySQL版本低于8.0.16,CHECK约束无实际校验作用
MySQL在8.0.16版本发布之前,仅支持CHECK约束的语法解析,执行约束创建语句不会报错,但内核不会对后续的插入、更新操作做规则校验,约束定义仅作为表元数据存储,不会实际生效。如果使用的是该版本之前的MySQL,要实现字段值校验只能通过触发器逻辑实现,或升级MySQL到8.0.16及以上版本。 - 原因2:正则表达式规则不符合严格校验需求
你当前使用的正则[0-9]{10}的匹配逻辑是只要字符串中包含连续10位数字即可通过校验,而非要求整个字符串恰好为10位数字。你插入的12位数字058669493211中显然包含连续10位数字,所以即使约束生效,该条数据也会通过校验。
如果要严格要求PhoneNum字段必须为10位纯数字,正则需要添加首尾匹配标识,正确写法如下:
alter table people add constraint people_chk_1 check (PhoneNum REGEXP '^[0-9]{10}$' );
补充说明:如果你的MySQL版本在8.0.16及以上,仍出现约束不生效的情况,可以执行
show variables like 'check_constraint_checks';确认参数是否为ON,该参数为OFF时会全局禁用所有CHECK约束的校验逻辑。
内容的提问来源于stack exchange,提问作者Maor Salman
相关产品推荐
相关产品推荐

