postgres:约束检查和空值

时间:2009-07-25 10:28:47

标签: database postgresql constraints

请看下表:

   name  |  x  |  y
---------+-----+------
   foo   |  3  |  5
   bar   | 45  | 99 
  foobar | 88  | 
  barfoo |  0  | 45

我想添加一个约束CHECK(y> x),但是这显然会失败,因为行'foobar'违反了它。

如何创建一个约束:check(y> x),但仅当y不为null?

2 个答案:

答案 0 :(得分:19)

事实上,你真的不需要做任何其他事情。如果检查表达式的计算结果为true或空值,则满足检查约束。

你的约束CHECK(y> x)将在你的场景中工作,因为行foobar不会违反约束,因为它的计算结果为null

答案 1 :(得分:1)

您可以将IS NULL测试放入CHECK表达式,如下所示:

CREATE TABLE mytable (
    name TEXT,
    x INTEGER,
    y INTEGER CHECK (y IS NULL OR y > x)
);

(在PostgreSQL 8.4上测试)