sql >> Database >  >> RDS >> PostgreSQL

Postgres, update en vergrendel bestellen

Er is geen ORDER BY in de UPDATE commando.
Maar er is voor SELECT . Gebruik vergrendeling op rijniveau met de FOR UPDATE clausule in een subquery:

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;

Natuurlijk, b moet UNIQUE zijn of je moet meer uitdrukkingen toevoegen aan de ORDER BY clausule om het ondubbelzinnig te maken.

En je moet hetzelfde bevel afdwingen voor allemaal UPDATE , DELETE en SELECT .. FOR UPDATE uitspraken op tafel.

Gerelateerd, met meer details:



  1. MySql:alleen-lezen opties verlenen?

  2. bind_param() alleen nodig voor door de gebruiker ingevoerde waarden of allemaal?

  3. GROUP BY + CASE-instructie

  4. Produceer DISTINCT-waarden in STRING_AGG