2009-07-25 91 views
7

请看看下面的表中:Postgres的:约束检查和空值

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

我想补充一个约束CHECK(Y> X),但是这显然会失败,由于它是由违反排'foobar'。

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

回答

11

其实,你真的不需要做别的。如果检查表达式的计算结果为true或空值,则检查约束得到满足。

你的约束CHECK(Y> X)将作为工作在你的方案,因为该行foobar的不违反约束,因为它的计算结果为空

2

你可以把一个IS NULL测试到CHECK表达式,像这样:

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

(PostgreSQL的8.4测试)

+3

这完全是没有必要的。 PostgreSQL手册引用:*应该注意的是,如果检查表达式的计算结果为true或空值,则检查约束条件得到满足。因为如果任何操作数为空,大多数表达式将计算为空值,它们将不会阻止受约束列中的空值。*(http://www.postgresql.org/docs/8.1/static/ddl-constraints.html) – 2012-02-24 20:06:50