Jeśli może istnieć jednoczesny dostęp do zapisu do zaangażowanych tabel występują warunki wyścigu w następujących zapytaniach. Rozważ:
Twój przykład może użyj CTE (wspólne wyrażenie tabelowe), ale nie da ci niczego, czego nie może zrobić podzapytanie:
WITH x AS (
SELECT psp_id
FROM global.prospect
WHERE status IN ('new', 'reset')
ORDER BY request_ts
LIMIT 1
)
UPDATE global.prospect psp
SET status = status || '*'
FROM x
WHERE psp.psp_id = x.psp_id
RETURNING psp.*;
Zwrócony wiersz będzie zaktualizowany wersja.
Jeśli chcesz wstawić zwrócony wiersz do innej tabeli, to jest tam WITH
klauzula staje się niezbędna:
WITH x AS (
SELECT psp_id
FROM global.prospect
WHERE status IN ('new', 'reset')
ORDER BY request_ts
LIMIT 1
)
, y AS (
UPDATE global.prospect psp
SET status = status || '*'
FROM x
WHERE psp.psp_id = x.psp_id
RETURNING psp.*
)
INSERT INTO z
SELECT *
FROM y;
Zapytania modyfikujące dane za pomocą CTE zostały dodane w PostgreSQL 9.1.
instrukcja o WITH
zapytania (CTE).