Postgresql

帶有子查詢 LIMIT 1 的 UPDATE 返回多行

  • March 7, 2018

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

引用自:https://dba.stackexchange.com/questions/199581