繁体   English   中英

Postgresql约束CHECK条件

[英]Postgresql Constraint CHECK conditional

我有一个列的表:c1,c2,c3,c4我试图添加一个CONSTRAINT检查条件是:

  1. 如果c4不为null,那么c1,c2,c3都不能为空。
  2. 否则,如果c4为null,则c1,c2,c3是可选的,但至少有一个字段必须为非null。

这是我的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测试但是约束不起作用。 谢谢!

尝试在第二种情况下对“c1 IS NOT NULL或c2 IS NOT NULL或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)) )

使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM