Postgres decide di verificare i vincoli di tipo IMMEDIATELY
in un momento diverso da quello proposto nello standard SQL.
In particolare, la documentazione per SET CONSTRAINTS
afferma (sottolineatura mia):
Postgres sceglie di eseguire questa query utilizzando un piano che si traduce in una collisione temporanea per sort_order
e IMMEDIATAMENTE non riesce. Tieni presente che per lo stesso schema e gli stessi dati, la stessa query potrebbe funzionare o non riuscire a seconda del piano di esecuzione.
Dovrai rendere il vincolo DEFERRABLE
o DEFERRABLE INITIALLY DEFERRED
, che ritarda la verifica del vincolo fino al termine dell'operazione o fino al punto in cui una dichiarazione SET CONSTRAINTS ... IMMEDIATE
viene eseguito.
Addendum dal commento di @HansGinzel: