PostgreSQL CHECK约束校验车牌合法性报错求助
解决PostgreSQL CHECK约束验证车牌的错误问题
错误原因
你写的CHECK约束里,OR运算符的右侧只是一个字符串'[0-9][0-9][a-Za-Z][a-Za-Z][0-9][0-9]',而OR要求两边都是布尔表达式(能返回true/false的判断逻辑)。数据库把这个字符串当成布尔值解析,自然会报错。
修正后的代码
给第二个匹配条件也加上matricula ~前缀,让两边都是完整的正则匹配判断:
CONSTRAINT proper_matricula CHECK ( matricula ~ '[a-Za-Z][a-Za-Z][0-9][0-9][a-Za-Z][a-Za-Z]' OR matricula ~ '[0-9][0-9][a-Za-Z][a-Za-Z][0-9][0-9]' )
优化建议
可以用PostgreSQL支持的POSIX字符类简化正则,同时加上^和$锚定整个字符串,避免匹配到包含合法格式但长度不符的内容:
CONSTRAINT proper_matricula CHECK ( matricula ~ '^[[:alpha:]]{2}[[:digit:]]{2}[[:alpha:]]{2}$' OR matricula ~ '^[[:digit:]]{2}[[:alpha:]]{2}[[:digit:]]{2}$' )
[[:alpha:]]等价于[a-zA-Z],匹配任意字母[[:digit:]]等价于[0-9],匹配任意数字^表示字符串开头,$表示字符串结尾,确保整个车牌刚好是6位符合格式
内容的提问来源于stack exchange,提问作者Kripthonite
相关产品推荐
相关产品推荐

