SQL CHECK()约束如何实现输入值为5位纯数字的校验
问题排查与修复方案
核心错误点
- 列名不匹配:你建表时定义的待校验字段是
PIN,但两个CHECK约束里都误用了不存在的字段title,导致约束完全没有作用到目标字段上。 LIKE语法兼容性问题:标准SQL的LIKE操作符不支持[0-9]这种正则字符组匹配规则,该写法仅在SQL Server中生效,MySQL、SQLite、PostgreSQL等主流数据库都不支持该语法,所以校验失效。
各数据库对应修复写法
你可以根据自己使用的数据库选择对应写法,以下写法都可以直接实现「5位纯数字」的校验,不需要单独加长度判断,正则本身已经覆盖了长度限制:
- SQL Server
改对列名即可沿用原有逻辑:
CREATE TABLE Code ( PIN TEXT NOT NULL, CHECK(PIN LIKE '[0-9][0-9][0-9][0-9][0-9]') );
- MySQL 8.0+
使用REGEXP正则匹配:
CREATE TABLE Code ( PIN TEXT NOT NULL, CHECK(PIN REGEXP '^[0-9]{5}$') );
注:MySQL 5.7及更早版本不支持CHECK约束的执行,需要用触发器或者应用层做校验。
- PostgreSQL
使用正则匹配操作符~:
CREATE TABLE Code ( PIN TEXT NOT NULL, CHECK(PIN ~ '^[0-9]{5}$') );
- SQLite
使用支持字符组匹配的GLOB操作符:
CREATE TABLE Code ( PIN TEXT NOT NULL, CHECK(PIN GLOB '[0-9][0-9][0-9][0-9][0-9]') );
内容的提问来源于stack exchange,提问作者DiaryWolf
相关产品推荐
相关产品推荐

