Es gibt kein ORDER BY im UPDATE Befehl.
Aber es gibt für SELECT . Verwenden Sie Sperren auf Zeilenebene
mit dem Code <>ZUR AKTUALISIERUNG Klausel
in einer Unterabfrage:
UPDATE foo f
SET a = 1
FROM (
SELECT b FROM foo
WHERE b IN (1,2,3,4)
ORDER BY b
FOR UPDATE
) upd
WHERE f.b = upd.b;
Natürlich b muss UNIQUE sein oder Sie müssen dem ORDER BY weitere Ausdrücke hinzufügen Klausel, um es eindeutig zu machen.
Und Sie müssen dieselbe Reihenfolge für alle durchsetzen AKTUALISIEREN , LÖSCHEN und SELECT .. FOR UPDATE Aussagen auf dem Tisch.
Verwandte, mit mehr Details:
- Postgres-UPDATE … LIMIT 1
- Vermeidung von PostgreSQL-Deadlocks bei Massenaktualisierungen und Löschvorgängen
- Optimierung gleichzeitiger Updates in Postgres