次の表を見てください。のpostgres:制約チェックとnull値
name | x | y
---------+-----+------
foo | 3 | 5
bar | 45 | 99
foobar | 88 |
barfoo | 0 | 45
私は制約CHECK(Y> X)を追加したいが、これは明らかにそれがで違反しているため、失敗します。行 'foobar'。
次のような制約を作成するにはどうすればいいですか:check(y> x)(yがnullでない場合のみ)
CREATE TABLE mytable (
name TEXT,
x INTEGER,
y INTEGER CHECK (y IS NULL OR y > x)
);
(PostgreSQLの8.4でテスト)
これは、単に必要ありませんがnullに評価するので行foobarには制約に違反しないので、あなたのシナリオであるように動作します。 PostgreSQLのマニュアルから引用:*チェック式がtrueまたはnull値と評価される場合、チェック制約が満たされることに注意してください。ほとんどの式は、いずれかのオペランドがNULLの場合はnull値に評価されるため、制約付き列のNULL値は禁止されません。*(http://www.postgresql.org/docs/8.1/static/ddl-constraints.html) –