同時書き込みアクセスが可能な場合 関連するテーブルに対して、次のクエリには競合状態があります。検討してください:
あなたの例はできます CTE(共通テーブル式)を使用しますが、サブクエリで実行できなかったものは何もありません:
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.*;
返される行は更新されます バージョン。
場合 返された行を別のテーブルに挿入したい場合は、そこでWITH
条項が不可欠になります:
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;
CTEを使用したデータ変更クエリはPostgreSQL9.1で追加されました。WITH
に関するマニュアル クエリ(CTE)。