Il n'y a pas de ORDER BY
dans la UPDATE
commande.
Mais il y en a pour SELECT
. Utilisez verrouillage au niveau de la ligne
avec le FOR UPDATE
clause
dans une sous-requête :
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;
Bien sûr, b
doit être UNIQUE
ou vous devez ajouter plus d'expressions au ORDER BY
clause pour la rendre sans ambiguïté.
Et vous devez appliquer la même commande pour tous UPDATE
, DELETE
et SELECT .. FOR UPDATE
déclarations sur la table.
Connexe, avec plus de détails :
- MISE À JOUR Postgres… LIMITE 1
- Éviter les interblocages PostgreSQL lors de l'exécution d'opérations de mise à jour et de suppression en masse
- Optimisation des mises à jour simultanées dans Postgres