MySQL检查约束触发违反报错,但插入数据符合约束规则的问题排查求助
解决MySQL CHECK约束中LIKE模式的问题
嘿,我知道你为啥会遇到这个报错啦!问题出在MySQL对LIKE操作符的语法支持上——它不识别正则表达式里的[0-9]字符类。
你写的约束CHECK (customerid LIKE 'CU[0-9][0-9][0-9]'),在MySQL里会把[0-9]当成普通的字符串字符,而不是“匹配0到9之间的数字”。也就是说,这个约束实际上要求customerid必须严格等于CU[0-9][0-9][0-9]这串字符,而不是你想要的“CU开头加三个数字”,所以插入CU001自然会触发违反约束的报错。
给你几个可行的解决办法:
方法1:用REGEXP替换LIKE(推荐)
MySQL支持正则表达式匹配,用REGEXP(或别名RLIKE)就能正确解析[0-9]这类字符类。修改后的建表语句如下:
CREATE TABLE customer ( customerid CHAR(5) NOT NULL, PRIMARY KEY (customerid), CONSTRAINT cekcustomerid CHECK (customerid REGEXP '^CU[0-9]{3}$') );
这里的^和$是正则锚点,确保整个字符串从开头到结尾都是CU加三个数字,避免出现类似CU001X这种不符合长度的情况。
方法2:用LIKE加字符范围判断
如果不想用正则,也可以通过LIKE固定长度,再逐个检查后续字符是否为数字:
CREATE TABLE customer ( customerid CHAR(5) NOT NULL, PRIMARY KEY (customerid), CONSTRAINT cekcustomerid CHECK ( customerid LIKE 'CU___' AND SUBSTRING(customerid, 3, 1) BETWEEN '0' AND '9' AND SUBSTRING(customerid, 4, 1) BETWEEN '0' AND '9' AND SUBSTRING(customerid, 5, 1) BETWEEN '0' AND '9' ) );
CU___确保字符串长度是5位(_代表单个任意字符),再通过SUBSTRING提取后三位,分别判断是否在数字字符范围内。
另外补充一句:你的MySQL版本应该是8.0.16及以上,因为这个版本之后MySQL才真正生效CHECK约束,之前的版本只是解析但不执行约束逻辑,这也解释了为啥你会触发报错(约束在正常工作,只是模式写错了)。
用上面任意一种方法修改建表语句后,再插入CU001就不会有问题啦!
内容的提问来源于stack exchange,提问作者Muhammad Ernanda
相关产品推荐
相关产品推荐

