Postgres decide verificar las restricciones de tipo IMMEDIATELY
en un momento diferente al propuesto en el estándar SQL.
Específicamente, la documentación para SET CONSTRAINTS
estados (énfasis mío):
Postgres elige ejecutar esta consulta usando un plan que resulta en una colisión temporal para sort_order
y INMEDIATAMENTE falla Tenga en cuenta que eso significa que para el mismo esquema y los mismos datos, la misma consulta puede funcionar o fallar según el plan de ejecución.
Tendrás que hacer la restricción DEFERRABLE
o DEFERRABLE INITIALLY DEFERRED
, que retrasa la verificación de la restricción hasta el final de la transacción o hasta el punto en que una declaración SET CONSTRAINTS ... IMMEDIATE
se ejecuta.
Apéndice del comentario de @HansGinzel: