在 postgres SQL 中使用 OR 进行检查约束

Bla*_*nen 5 sql postgresql constraints

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

我的情况:

4 表:\

  • main,它是一个 id、一个类型变量(让它成为 0-2 的 smallint)和下表的外键:
  • 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
Run Code Online (Sandbox Code Playgroud)

如果 type = 1 我不在乎填写什么。

我尝试像这样做一个检查约束:

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))
Run Code Online (Sandbox Code Playgroud)

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

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

Gor*_*off 6

!= 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)
      )
Run Code Online (Sandbox Code Playgroud)