請看看下面的表中:Postgres的:約束檢查和空值
name | x | y
---------+-----+------
foo | 3 | 5
bar | 45 | 99
foobar | 88 |
barfoo | 0 | 45
我想補充一個約束CHECK(Y> X),但是這顯然會失敗,由於它是由違反排'foobar'。
如何創建一個約束:check(y> x),但僅當y不爲null?
請看看下面的表中:Postgres的:約束檢查和空值
name | x | y
---------+-----+------
foo | 3 | 5
bar | 45 | 99
foobar | 88 |
barfoo | 0 | 45
我想補充一個約束CHECK(Y> X),但是這顯然會失敗,由於它是由違反排'foobar'。
如何創建一個約束:check(y> x),但僅當y不爲null?
其實,你真的不需要做別的。如果檢查表達式的計算結果爲true或空值,則檢查約束得到滿足。
你的約束CHECK(Y> X)將作爲工作在你的方案,因爲該行foobar的不違反約束,因爲它的計算結果爲空
你可以把一個IS NULL測試到CHECK表達式,像這樣:
CREATE TABLE mytable (
name TEXT,
x INTEGER,
y INTEGER CHECK (y IS NULL OR y > x)
);
(PostgreSQL的8.4測試)
這完全是沒有必要的。 PostgreSQL手冊引用:*應該注意的是,如果檢查表達式的計算結果爲true或空值,則檢查約束條件得到滿足。因爲如果任何操作數爲空,大多數表達式將計算爲空值,它們將不會阻止受約束列中的空值。*(http://www.postgresql.org/docs/8.1/static/ddl-constraints.html) – 2012-02-24 20:06:50