Documentation PostgreSQL 9.3.25 > Référence > Commandes SQL > SET CONSTRAINTS | |
SET | SET ROLE |
SET CONSTRAINTS — initialise le moment de vérification de contrainte de la transaction en cours
SET CONSTRAINTS { ALL | nom [, ...] } { DEFERRED | IMMEDIATE }
SET CONSTRAINTS initialise le comportement de la vérification des contraintes dans la transaction en cours. Les contraintes IMMEDIATE sont vérifiées à la fin de chaque instruction. Les contraintes DEFERRED ne sont vérifiées qu'à la validation de la transaction. Chaque contrainte a son propre mode IMMEDIATE ou DEFERRED.
À la création, une contrainte se voit donner une des trois caractéristiques : DEFERRABLE INITIALLY DEFERRED, DEFERRABLE INITIALLY IMMEDIATE ou NOT DEFERRABLE. La troisième forme est toujours IMMEDIATE et n'est pas affectée par la commande SET CONSTRAINTS. Les deux premières classes commencent chaque transaction dans le mode indiqué mais leur comportement peut changer à l'intérieur d'une transaction par SET CONSTRAINTS.
SET CONSTRAINTS avec une liste de noms de contraintes modifie le mode de ces contraintes (qui doivent toutes être différables). Chaque nom de contrainte peut être qualifié d'un schéma. Le chemin de recherche des schémas est utilisé pour trouver le premier nom correspondant si aucun nom de schéma n'a été indiqué. SET CONSTRAINTS ALL modifie le mode de toutes les contraintes déférables.
Lorsque SET CONSTRAINTS modifie le mode d'une contrainte de DEFERRED à IMMEDIATE, le nouveau mode prend effet rétroactivement : toute modification de données qui aurait été vérifiée à la fin de la transaction est en fait vérifiée lors de l'exécution de la commande SET CONSTRAINTS. Si une contrainte est violée, la commande SET CONSTRAINTS échoue (et ne change pas le mode de contrainte). Du coup, SET CONSTRAINTS peut être utilisée pour forcer la vérification de contraintes à un point spécifique d'une transaction.
Actuellement, seules les contraintes UNIQUE, PRIMARY KEY, REFERENCES (clé étrangère) et EXCLUDE sont affectées par ce paramètre. Les contraintes NOT NULL et CHECK sont toujours vérifiées immédiatement quand une ligne est insérée ou modifiée (pas à la fin de l'instruction). Les contraintes uniques et d'exclusion qui n'ont pas été déclarées DEFERRABLE sont aussi vérifiées immédiatement.
Le déclenchement des triggers qui sont déclarés comme des « triggers de contraintes » est aussi contrôlé par ce paramètre -- ils se déclenchent au même moment que la contrainte associée devait être vérifiée.
Comme PostgreSQL™ ne nécessite pas les noms de contraintes d'être uniques à l'intérieur d'un schéma (mais seulement par tables), il est possible qu'il y ait plus d'une correspondance pour un nom de contrainte spécifié. Dans ce cas, SET CONSTRAINTS agira sur toutes les correspondances. Pour un nom sans qualification de schéma, une fois qu'une ou plusieurs correspondances ont été trouvées dans les schémas du chemin de recherche, les autres schémas du chemin ne sont pas testés.
Cette commande altère seulement le comportement des contraintes à l'intérieur de la transaction en cours. Du coup, si vous exécutez cette commande en dehors d'un bloc de transaction (pair BEGIN/COMMIT), elle ne semble pas avoir d'effet.
Cette commande est compatible avec le comportement défini par le standard SQL en dehors du fait que, dans PostgreSQL™, il ne s'applique pas aux contraintes NOT NULL et CHECK. De plus, PostgreSQL™ vérifie les contraintes uniques non déferrables immédiatement, pas à la fin de l'instruction comme le standard le suggère.