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

#1 20/07/2011 17:59:24

Jiff
Membre

Référence à une autre colonne dans une constraint de colonne

Ha que coucou forumers,

Je bute sur un PB de CHECK qui doit dépendre d'une autre colonne que celle à laquelle il est appliqué.
J'ai tenté de le formaliser comme suit, mais y fait rien qu'à m'embêter:

phpwiki=# CREATE TABLE tstchk(
phpwiki(#     a   BOOLEAN     NOT NULL    DEFAULT TRUE,
phpwiki(#     b   TEXT                    DEFAULT NULL    CHECK (IF (NOT a) THEN ((b IS NOT NULL) AND (char_length(b) > 3) END IF))
phpwiki(# );
ERROR:  syntax error at or near "THEN"
LINE 3: ...                DEFAULT NULL    CHECK (IF (NOT a) THEN ((b I...
                                                             ^

Est-ce qu'une telle constraint est possible (et où pêche-t'elle?) ou bien existe-t'il un artifice permettant de contourner ce PB?

JY

Hors ligne

#2 20/07/2011 19:00:27

gleu
Administrateur

Re : Référence à une autre colonne dans une constraint de colonne

Une contrainte CHECK s'applique à une colonne et une seule. Le seul moyen de parvenir à vos fins est d'ajouter un trigger à la table. Le code du trigger sera responsable du respect de la contrainte.


Guillaume.

Hors ligne

#3 20/07/2011 19:17:06

cedric
Membre

Re : Référence à une autre colonne dans une constraint de colonne

gleu a écrit :

Une contrainte CHECK s'applique à une colonne et une seule. Le seul moyen de parvenir à vos fins est d'ajouter un trigger à la table. Le code du trigger sera responsable du respect de la contrainte.

c'est possible avec une contrainte sur la table:

CREATE TABLE tstchk (
a bool not null default true,
b text default null,
CHECK ((a is false and b is not null and char_length(b)>0 ) or (a is true) )
)


Cédric Villemain +33 (0)6 20 30 22 52
http://2ndQuadrant.fr/
PostgreSQL: Support 24x7 - Développement, Expertise et Formation

Hors ligne

#4 20/07/2011 20:37:57

Jiff
Membre

Re : Référence à une autre colonne dans une constraint de colonne

YES!

CREATE TABLE tstchk (
a bool not null default true,
b text default null,
CHECK ((a IS FALSE AND b IS NOT NULL AND char_length(b)>0 ) OR (a IS TRUE AND b IS NULL) )
)

Je savais  bien que ça devait être possible sans trigger, merci smile

Edit 20110721@0038:
J'ai fini par retrouver mes notes.
On peut aussi avoir un CHECK dans la ligne qui vérifie les autres colonnes en utilisant:
..... CHECK(CASE blah THEN blahblah AND blahblahblah ..... END),

Dernière modification par Jiff (21/07/2011 00:40:35)

Hors ligne

#5 20/07/2011 21:08:47

gleu
Administrateur

Re : Référence à une autre colonne dans une constraint de colonne

Punaise, je ne connaissais pas ça. C'est cool smile Merci Cédric.


Guillaume.

Hors ligne

Pied de page des forums