You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 17:15:01