2009-07-25 25 views
7

次の表を見てください。の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でテスト)

答えて

11

実際には、あなたが本当に何もする必要はありません。

2

あなたが置くことができますが、このように、CHECK式にNULLテストです。検査式がtrueまたはnull値と評価される場合、検査制約は満たされます。

あなたの制約CHECK(Y> X)は

+3

これは、単に必要ありませんがnullに評価するので行foobarには制約に違反しないので、あなたのシナリオであるように動作します。 PostgreSQLのマニュアルから引用:*チェック式がtrueまたはnull値と評価される場合、チェック制約が満たされることに注意してください。ほとんどの式は、いずれかのオペランドがNULLの場合はnull値に評価されるため、制約付き列のNULL値は禁止されません。*(http://www.postgresql.org/docs/8.1/static/ddl-constraints.html) –

関連する問題