2009-07-25 17 views
7

si prega di dare un'occhiata alla seguente tabella:postgres: controllo del vincolo e valori nulli

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

voglio aggiungere un vincolo CHECK (y> x), ma questo ovviamente non riuscirà a causa viene violata dal riga 'foobar'.

Come si crea un vincolo che dice: check (y> x), ma solo se y non null?

risposta

11

In realtà, non si ha realmente bisogno di fare altro. Un vincolo di verifica è soddisfatto se l'espressione di controllo restituisce true o il valore null.

tuo vincolo CHECK (y> x) avrebbe funzionato come è nel vostro scenario perché il foobar riga non violerebbe il vincolo in quanto valuta null

2

si può mettere un IS NULL prova nella CONTROLLO espressione, in questo modo:

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

(testato su PostgreSQL 8.4)

+3

Questo non è semplicemente necessario. Citazione dal manuale di PostgreSQL: * Si noti che un vincolo di verifica è soddisfatto se l'espressione di controllo restituisce true o il valore null. Poiché la maggior parte delle espressioni valuterà il valore null se qualsiasi operando è nullo, non impediranno i valori nulli nelle colonne vincolate. * (Http://www.postgresql.org/docs/8.1/static/ddl-constraints.html) –