MySQL如何使用CHECK约束:实现EmployeeID格式与DOB年龄校验
先帮你排查代码里的实际问题
- 语法位置错误:你把CHECK语句卡在两个字段定义中间,还写了
##开头的注释,MySQL根本不认这个注释格式,单行注释要写# 内容或者-- 内容,且CHECK约束要么跟在对应字段定义后面,要么在所有字段列完之后统一当表级约束写。 - 数据库方言不匹配:你写的
interval '16' year是PostgreSQL的语法,MySQL里时间间隔的写法是INTERVAL 16 YEAR,数值外面不用加单引号。 - 版本坑要注意:MySQL 8.0.16之前的版本会兼容解析CHECK语法,但根本不会做实际校验,写了等于白写,先运行
SELECT VERSION();确认下你的数据库版本再用。
两个规则的正确实现写法
- EmployeeID格式校验:因为要求是E开头加3个整数,用正则匹配最稳妥,约束写法为
CHECK (EmployeeID REGEXP '^E[0-9]{3}$')。这里的^代表字符串开头,[0-9]匹配数字,{3}要求恰好出现3次,$代表字符串结尾,能把所有不符合格式的值拦下来,比如E1234、E12A、XE123这类错值都通不过。 - 16周岁校验:原始计算逻辑是对的,只要把语法改对就行:
CHECK (DOB <= CURRENT_DATE - INTERVAL 16 YEAR)。意思是只要出生日期早于等于“当前日期往前推16年”的那天,就满足年龄要求。
改完能直接运行的建表语句
CREATE TABLE Employee( EmployeeID VARCHAR(200) NOT NULL PRIMARY KEY, DOB DATE, -- 校验工号格式为E+3位数字 CHECK (EmployeeID REGEXP '^E[0-9]{3}$'), -- 校验出生日期满16周岁 CHECK (DOB <= CURRENT_DATE - INTERVAL 16 YEAR), FirstName VARCHAR(200), MiddleName VARCHAR(200), LastName VARCHAR(200), Address VARCHAR(255), StartDate DATE, Gender VARCHAR(100) );
补充小提示:这个年龄校验只在插入、修改数据的那一刻触发,按操作当时的时间算年龄阈值,已经存到表里的旧数据不会因为后续年份增长被重新拦截校验。
内容的提问来源于stack exchange,提问作者eliesmith
相关产品推荐
相关产品推荐

