PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 27/05/2011 19:36:57

bebert73
Membre

remarque concernant la contrainte check

Bonjour

c'est une remarque plus qu'une question, un truc qui m'a surpris : je me suis aperçu que lorsqu'une contrainte CHECK renvoie NULL, il laisse passer toutes les valeurs

soit un cas simple

CREATE TABLE toto (
    titi    INTEGER    PRIMARY KEY,
    tata    INTEGER   
        CHECK (tata = pipot(titi))
);

Je m'étais retrouvé avec des données dans la table toto qui selon moi auraient dû être rejetées par le CHECK. En cherchant, j'ai découvert que j'avais fait une erreur dans pipot(titi), qui renvoyait null dans certains cas...donc la vérification tata = pipot(titi) renvoyait forcément aussi null

je m'attendais à ce que dans ce cas toute insertion dans toto soit rejetée à cause de cette contrainte CHECK non vérifiée, mais en fait au contraire il laisse tout passer

Autrement dit, si CHECK renvoie NULL l'insertion est acceptée, c'est uniquement quand CHECK renvoie FALSE que c'est rejeté

Il faut donc veiller à ce que CHECK renvoie toujours TRUE ou FALSE, et jamais NULL, au risque de se retrouver avec des insertions non voulues

un peu surprenant quand même...

Hors ligne

#2 27/05/2011 19:50:03

Marc Cousin
Membre

Re : remarque concernant la contrainte check

Oui, mais c'est dans la doc smile
CHECK ( expression )
The CHECK clause specifies an expression producing a Boolean result which new or updated rows must satisfy for an insert or update operation to succeed. Expressions evaluating to TRUE or UNKNOWN succeed.

C'est aussi ce que dit la norme SQL. C'est d'ailleurs pour ça que c'est comme ça dans Postgres.

Pas que ça me semble à moi non plus forcément logique d'accepter une donnée dont la contrainte check répond 'je ne sais pas', mais c'est la norme smile


Marc.

Hors ligne

#3 27/05/2011 19:58:05

bebert73
Membre

Re : remarque concernant la contrainte check

...et on ne discute pas avec la norme

bon, on va dire qu'ils ont fait ça pour nous motiver à écrire des contraintes CHECK bien propres qui ne renvoient jamais null smile

en tout cas merci, vous avez décidément réponse à tout !

Hors ligne

#4 27/05/2011 20:33:05

Marc Cousin
Membre

Re : remarque concernant la contrainte check

Si seulement… smile


Marc.

Hors ligne

Pied de page des forums