添加基于列值的非空CHECK约束未生效,请求技术协助
问题分析与解决办法
你的CHECK约束未生效的核心原因是错误地用单引号包裹了列名。比如'col_2'这种写法会被数据库解析为字符串常量,而不是引用表中的col_2列。字符串'col_2'本身永远不会是NULL,导致你的约束条件始终为真,完全起不到校验作用。
修正后的正确CHECK约束代码如下:
ALTER TABLE "my_table" ADD CONSTRAINT check_for_type CHECK ( (col_1 = 'a' AND col_2 IS NOT NULL) OR (col_1 = 'b' AND col_2 IS NOT NULL AND col_3 IS NOT NULL) OR (col_1 = 'c' AND col_4 IS NOT NULL) -- 可选:若需限制col_1只能为'a'/'b'/'c',添加以下条件 OR col_1 NOT IN ('a', 'b', 'c') );
说明:
- 去掉列名外的单引号,直接使用列名(如
col_2)才能正确引用表中的字段 - 若业务要求
col_1只能取'a'/'b'/'c'这三个值,加上最后一行的OR col_1 NOT IN ('a', 'b', 'c')条件,避免其他值绕过约束校验
内容的提问来源于stack exchange,提问作者L. Veado
相关产品推荐
相关产品推荐

