Postgres postanawia sprawdzić ograniczenia typu IMMEDIATELY
w innym czasie niż proponowany w standardzie SQL.
W szczególności dokumentacja SET CONSTRAINTS
stany (podkreślenie moje):
Postgres decyduje się na wykonanie tego zapytania przy użyciu planu, który powoduje tymczasową kolizję dla sort_order
i NATYCHMIAST zawodzi. Pamiętaj, że oznacza to, że dla tego samego schematu i tych samych danych to samo zapytanie może zadziałać lub zakończyć się niepowodzeniem w zależności od planu wykonania.
Będziesz musiał ustawić ograniczenie DEFERRABLE
lub DEFERRABLE INITIALLY DEFERRED
, co opóźnia weryfikację ograniczenia do końca transakcji lub do momentu, w którym instrukcja SET CONSTRAINTS ... IMMEDIATE
jest wykonywany.
Dodatek z komentarza @HansGinzel: