Postgres bestämmer sig för att kontrollera begränsningar av typen IMMEDIATELY
vid en annan tidpunkt än vad som föreslås i SQL-standarden.
Specifikt dokumentationen för SET CONSTRAINTS
anger (min betoning):
Postgres väljer att köra denna fråga med en plan som resulterar i en tillfällig kollision för sort_order
och OMEDELBART misslyckas. Observera att det betyder att för samma schema och samma data kan samma fråga fungera eller misslyckas beroende på exekveringsplanen.
Du måste göra begränsningen DEFERRABLE
eller DEFERRABLE INITIALLY DEFERRED
, vilket fördröjer verifieringen av begränsningen till slutet av transaktionen eller upp till den punkt där en sats SET CONSTRAINTS ... IMMEDIATE
exekveras.
Tillägg från @HansGinzels kommentar: