2009-07-25 15 views
7

bitte einen Blick auf die folgende Tabelle haben:Postgres: Bedingungsprüfung und Nullwerte

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

Ich möchte eine Einschränkung CHECK (y> x) hinzufügen, aber dies wird offensichtlich aufgrund nicht durch die verletzt Zeile "Foobar".

Wie erstelle ich eine Einschränkung, die sagt: check (y> x), aber nur wenn y nicht null?

Antwort

11

In der Tat, Sie nicht wirklich brauchen, etwas anderes zu tun. Eine Prüfbedingung ist erfüllt, wenn der Prüfausdruck als wahr oder als Nullwert ausgewertet wird.

Ihre Einschränkung CHECK (y> x) funktionieren würde, wie in Ihrem Szenario ist, weil die Zeile foobar nicht die Einschränkung verletzen würde, da es diese

2

können Sie legen ein NULL-Test in der CHECK-Ausdruck, wie folgt aus:

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

(getestet auf PostgreSQL 8.4)

+3

ist einfach nicht notwendig auf Null auswertet. Zitat aus dem PostgreSQL-Handbuch: * Es sollte beachtet werden, dass eine Prüfbedingung erfüllt ist, wenn der Prüfausdruck als wahr oder als Nullwert ausgewertet wird. Da die meisten Ausdrücke auf den Nullwert ausgewertet werden, wenn ein Operand null ist, verhindern sie keine Nullwerte in den eingeschränkten Spalten. * (Http://www.postgresql.org/docs/8.1/static/ddl-constraints.html) –