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. Exécuter cette commande en dehors d'un bloc de transaction cause l'émission d'un message d'avertissement mais n'a pas d'autres effets.
   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.