Postgresql
帶有子查詢 LIMIT 1 的 UPDATE 返回多行
我正在努力處理一個隨機返回多行而不是一行的查詢。我正在使用 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 如何決定執行更新,從外部選擇(可能有多行)或內部選擇開始。