2009-07-25 10 views
7

s'il vous plaît jeter un oeil à la table suivante:postgres: vérification de la contrainte et les valeurs nulles

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

Je veux ajouter une CHECK contrainte (y> x), mais ce sera évidemment l'échec du fait qu'elle est violée par la rangée 'foobar'. Comment créer une contrainte qui indique: check (y> x), mais seulement si y n'est pas null?

Répondre

11

En fait, vous ne avez pas vraiment besoin de faire autre chose. Une contrainte de vérification est satisfaite si l'expression de vérification est évaluée à true ou à la valeur null.

CHÈQUE de contrainte (y> x) fonctionnerait comme il est dans votre scénario parce que le foobar de la ligne ne serait pas contraire à la contrainte, car il évalue à null

2

Vous pouvez mettre un test IS NULL dans l'expression CHECK, comme ceci:

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

(testé sur PostgreSQL 8.4)

+3

Ceci est tout simplement pas nécessaire. Citation du manuel de PostgreSQL: * Il est à noter qu'une contrainte de vérification est satisfaite si l'expression de vérification est évaluée à true ou à la valeur null. Puisque la plupart des expressions seront évaluées à la valeur nulle si un opérande est nul, elles n'empêcheront pas les valeurs nulles dans les colonnes contraintes. * (Http://www.postgresql.org/docs/8.1/static/ddl-constraints.html) –

Questions connexes