2009-07-25 97 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