2009-07-25 9 views
7

Proszę spojrzeć na poniższą tabelą:postgres: Sprawdź ograniczenia i wartości null

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

chcę dodać ograniczenia CHECK (y> x), ale to oczywiście nie powiedzie się z powodu, że jest łamane przez wiersz "foobar".

Jak utworzyć ograniczenie, które mówi: check (y> x), ale tylko jeśli y nie jest pusta?

Odpowiedz

11

W rzeczywistości, naprawdę nie trzeba robić nic innego. Ograniczenie sprawdzające jest spełnione, jeśli wyrażenie check ma wartość true lub wartość pustą.

Twój ograniczenie wyboru (y> x) będzie działać jak w scenariuszu, ponieważ foobar rząd nie narusza ograniczenie ponieważ ocenia null

2

Można umieścić IS NULL testy do wyrażenia czek, tak:

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

(testowany na PostgreSQL 8.4)

+3

To nie jest po prostu konieczne. Cytat z podręcznika PostgreSQL: * Należy zauważyć, że ograniczenie sprawdzające jest spełnione, jeśli wyrażenie check ma wartość true lub wartość pustą. Ponieważ większość wyrażeń będzie oceniać wartość pustą, jeśli dowolny operand ma wartość null, nie zapobiegnie wartościom pustym w ograniczonych kolumnach. * (Http://www.postgresql.org/docs/8.1/static/ddl-constraints.html) –

Powiązane problemy