web-dev-qa-db-ja.com

サブクエリLIMIT 1を指定したUPDATEは複数の行を返します

1つではなく複数の行をランダムに返すクエリに苦労しています。 PostgreSQL 9.4.12を使用しています

クエリは次のとおりです。

UPDATE folder as f set locked = 'locked', date_locked = current_timestamp 
from (
    SELECT * from folder as f2 
    WHERE f2.locked = 'available'
    LIMIT 1 FOR UPDATE ) as folderToUpdate 
WHERE f.id = folderToUpdate.id returning f.*

idは主キーです。

一連の統合テストを通じて実行されます。上記のクエリを実行するテストのみを実行している場合、問題はありません。しかし、すべてのテストを実行すると、ランダムに複数の行が表示されます。何か提案はありますか?

1
Alex

複数の行が表示されるのはごく普通のことです。更新はフォルダーからすべての行を選択し、それらのそれぞれについてフォルダーf2から行を選択します(idがPKの場合は同じです)。 locked = 'available'の場合、レコードが更新されます。次の行へ。

正しい構文は Postgres UPDATE ... LIMIT 1 で、CTEを使用しています。

CTEがない場合、結果はPostgresSQLがどのように更新を実行するかを決定し、外側(複数の行が可能)または内側の選択から始まります。

5
Gerard H. Pille