postgres添加约束以确保如果另一列不为null,则一列不为null

时间:2014-04-27 17:46:55

标签: postgresql constraints

Postgres 9.3

我有两个整数类型的列' a'和' b'。有效选项包括:

  • '一个'是空的,' b'是null
  • '一个'不是空的,' b'是null
  • '一个'不是空的,' b'不是空的

我试图添加一个检查/约束来阻止无效选项:

  • '一个'是空的,' b'不是空的

我很感激任何帮助。

提前致谢 丹

2 个答案:

答案 0 :(得分:3)

看起来您的情况实际上是一个逻辑含义:如果a is null那么b is null。从我们的象征逻辑课程(在我的案例中为PHIL 140),我们知道:

(P -> Q) <-> (-P | Q)

其中->含义,<->是逻辑等价。

将其应用于我们的含义并对其进行SQL化会产生:

a is not null or b is null

所以一个简单的check(a is not null or b is null)约束就足够了。

演示:http://sqlfiddle.com/#!15/bebee/1

答案 1 :(得分:2)

create table t (
    a int,
    b int,
    check (
        a is null and b is null
        or
        a is not null and b is null
        or
        a is not null and b is not null
    )
);

insert into t (a, b) values
(null, null),
(1, null),
(1, 1),
(null, 1);
ERROR:  new row for relation "t" violates check constraint "t_check"
DETAIL:  Failing row contains (null, 1).