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: