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

MySQL使用CHECK约束限制特定值时未限制值插入报错如何解决

问题原因

你当前定义的CHECK约束逻辑覆盖范围不符合需求,约束要求每一行数据必须满足(name='one' AND year>1990) OR (name='two' AND year<1990),也就是说只有name为one或two、且对应年份符合要求的数据才会被判定合法。当插入name为three的数据时,两个判断分支都不满足,就会触发约束报错。

解决方法

在CHECK约束中补充第三种合法情况:当name既不是one也不是two时,直接判定为合法,不对年份做限制。

新表创建写法

如果是新建表,直接使用修改后的约束即可:

CREATE TABLE Movie(
name VARCHAR(30),
year int,
CHECK ((name='one' AND year>1990) OR (name='two' AND year<1990) OR name NOT IN ('one', 'two'))
);

已有表修改写法

如果表已经创建完成,不想清空重建,可以先删除原有约束,再添加修改后的约束:

-- 删除原有约束,约束名和报错提示里的一致即可,这里示例为报错里的movie_chk_1
ALTER TABLE Movie DROP CHECK movie_chk_1;
-- 添加新的符合需求的约束
ALTER TABLE Movie ADD CHECK ((name='one' AND year>1990) OR (name='two' AND year<1990) OR name NOT IN ('one', 'two'));

修改后可以满足所有需求场景:

  • name为one时,year必须大于1990才可插入
  • name为two时,year必须小于1990才可插入
  • name为其他任意值时,year没有限制,可正常插入

内容的提问来源于stack exchange,提问作者user10665914

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:45:03