Postgresql约束条件CHECK的条件语句

3

我有一个包含列 c1、c2、c3 和 c4 的表格,现在想要添加一个约束条件:

  1. 如果 c4 不为空,则 c1、c2、c3 都不能为 null。
  2. 否则,如果 c4 为空,则 c1、c2、c3 可选,但至少需要有一个字段不为空。

以下是我的 SQL 命令:

ADD CONSTRAINT quatereulchk CHECK( 
    (c1 IS NOT NULL AND c2 IS NOT NULL AND c3 IS NOT NULL AND c4 IS NOT NULL) 
    OR 
    (c4 IS NULL AND c1 IS NOT NULL OR c2 IS NOT NULL OR c3 IS NOT NULL)
    );

我用pg_admin进行了测试,但约束条件没有生效。谢谢!


提示:请检查“AND”和“OR”的优先级。如果我们谈论数学,您的DDL希望“2 * 2 + 2”等于“8”。 - zerkms
呃,根据我的情况而言,这是否意味着AND比OR的优先级更高?谢谢你的提示! - bf39L
1
是的(不仅在这种情况下,在任何情况下都是如此)。 - zerkms
1
顺便说一句,我真的很喜欢你回答问题的方式,给提示而不是直接给出答案。听到这个消息很高兴 :-) 不幸的是,在这里尊重这种方式的人非常少。 - zerkms
3
这个网站的理念是回答问题。遵循这个计划的人很难受到指责。 - klin
显示剩余2条评论
2个回答

4

例如,在第二种情况下尝试将“c1 IS NOT NULL OR c2 IS NOT NULL OR c3 IS NOT NULL”进行分组:

ADD CONSTRAINT quatereulchk CHECK( (c1 IS NOT NULL AND c2 IS NOT NULL AND c3 IS NOT NULL AND c4 IS NOT NULL) OR (c4 IS NULL AND (c1 IS NOT NULL OR c2 IS NOT NULL OR c3 IS NOT NULL)) )

2

使用coalesce()函数:

ADD CONSTRAINT quatereulchk CHECK( 
    (c1 IS NOT NULL AND c2 IS NOT NULL AND c3 IS NOT NULL AND c4 IS NOT NULL) 
    OR 
    (c4 IS NULL AND COALESCE(c1, c2, c3) IS NOT NULL)
    );

一些测试:

insert into example values
(null, null, null, null);
ERROR:  new row for relation "example" violates check constraint "quatereulchk"
DETAIL:  Failing row contains (null, null, null, null).

insert into example values
(null, null, 3, null);
INSERT 0 1

insert into example values
(null, 2, 3, 4);
ERROR:  new row for relation "example" violates check constraint "quatereulchk"
DETAIL:  Failing row contains (null, 2, 3, 4).

insert into example values
(1, 2, 3, 4);
INSERT 0 1

谢谢您的回复。我尝试了c1、c2、c3、c4 => (1.1、null、null、null),但它没有起作用。 - bf39L
1
抱歉,打错字了,应该是 coalesce(c1, c2, c3)。已经修改答案。 - klin
现在对我来说它可以工作了 ;D。只是我的好奇心。在上面的Manuel Saucedo的回答和你的回答之间,哪种方式更快? - bf39L
@Lester 这没关系 - zerkms
@Lester - 我认为没有显著的差异。 - klin
我明白了。谢谢大家! - bf39L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接