带有子查询 LIMIT 1 的 UPDATE 返回多行

Ale*_*lex 1 postgresql concurrency update postgresql-9.4

我正在努力处理随机返回多行而不是一行的查询。我正在使用 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.*
Run Code Online (Sandbox Code Playgroud)

id是主键。

它是通过一系列集成测试执行的。当我只执行上述查询的测试时,我没有任何问题。但是,当我执行所有测试时,我随机得到多行。你有什么建议吗?

Ger*_*lle 5

你得到多行是很正常的。更新从文件夹中选择所有行,并为它们中的每一个从文件夹 f2 中选择一行(我猜是一样的,如果 id 是 PK)。如果locked = 'available',则更新记录。进入下一行。

正确的语法在这里,Postgres UPDATE ... LIMIT 1,包括使用 CTE。

如果没有 CTE,您的结果取决于 PostgresSQL 决定如何执行您的更新,从外部(多行是可能的)或内部选择开始。