Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#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
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
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 Merci Cédric.
Guillaume.
Hors ligne