在postgres SQL中使用OR进行CHECK CONSTRAINT

时间:2017-01-26 11:12:57

标签: sql postgresql constraints

我想知道是否可以首先评估CHECK CONSTRAINT中的某些条件,然后对另一个表达式执行OR。

我的情况:

4表:\

  • main,一个id,一个类型变量(让它变为0-2的小),以及下表中的外键:
  • a,b和c,仅包含id

我想制作一个基本遵循以下逻辑的检查约束:

if main.type = 0:
    main.a != NULL
    main.b = NULL
    main.c = NULL
elif main.type = 2:
    main.a = NULL
    main.b = NULL
    main.c != NULL

如果类型= 1,我不在乎填写的内容。

我尝试像这样做一个CHECK CONSTRAINT:

CHECK((main.type = 0 AND main.a != NULL AND main.b = NULL AND main.c = NULL) OR
(main.type = 2 AND main.a = NULL AND main.b = NULL AND main.c != NULL))

问题是在应用此约束后内部括号被删除/忽略,这意味着它变得大部分是无意义的并且它不起作用。

这可以用CHECK CONSTRAINT解决,还是应该使用触发器?

1 个答案:

答案 0 :(得分:4)

!= NULL!那不行。这似乎是你想要的逻辑:

CHECK ( (type = 0 and a is not null and b is null and c is null) or
        (type = 2 and a is null and b is null and c is not null) or
        (type = 1)
      )