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
は主キーです。
一連の統合テストを通じて実行されます。上記のクエリを実行するテストのみを実行している場合、問題はありません。しかし、すべてのテストを実行すると、ランダムに複数の行が表示されます。何か提案はありますか?
複数の行が表示されるのはごく普通のことです。更新はフォルダーからすべての行を選択し、それらのそれぞれについてフォルダーf2から行を選択します(idがPKの場合は同じです)。 locked = 'available'の場合、レコードが更新されます。次の行へ。
正しい構文は Postgres UPDATE ... LIMIT 1 で、CTEを使用しています。
CTEがない場合、結果はPostgresSQLがどのように更新を実行するかを決定し、外側(複数の行が可能)または内側の選択から始まります。