Postgres décide de vérifier les contraintes de type IMMEDIATELY
à un moment différent de celui proposé dans la norme SQL.
Plus précisément, la documentation pour SET CONSTRAINTS
déclare (c'est moi qui souligne):
Postgres choisit d'exécuter cette requête en utilisant un plan qui entraîne une collision temporaire pour sort_order
et IMMÉDIATEMENT échoue. Notez que cela signifie que pour le même schéma et les mêmes données, la même requête peut fonctionner ou échouer selon le plan d'exécution.
Vous devrez rendre la contrainte DEFERRABLE
ou DEFERRABLE INITIALLY DEFERRED
, ce qui retarde la vérification de la contrainte jusqu'à la fin de la transaction ou jusqu'au moment où une instruction SET CONSTRAINTS ... IMMEDIATE
est exécuté.
Addendum du commentaire de @HansGinzel :