更新查询中的 LIMIT 1 更新所有行,而不仅仅是一个 postgres

时间:2021-03-02 10:06:06

标签: postgresql limit updates

我有这个查询,它只应该更新一行并返回更新的行,但它更新所有行而不是从选择返回的限制 1。 我试图实现的是对行的显式锁定,以便在使用 stats = pending(有点像队列)选择任何行时不会发生并发读取/选择

这是查询:

BEGIN;
UPDATE tasksq
SET    stats = 'active' 
WHERE  stats = (
         SELECT stats
         FROM   tasksq
         WHERE  stats = 'pending'
         ORDER BY jobid 
         LIMIT 1
         FOR UPDATE SKIP LOCKED
         )
RETURNING *;
COMMIT;

如果我只运行 limit 1 查询,那么它确实有效并返回 1 行

SELECT *
FROM   tasksq
WHERE  stats = 'pending'
ORDER BY jobid 
LIMIT 1
FOR UPDATE SKIP LOCKED

在下面找到数据集的片段:

enter image description here

1 个答案:

答案 0 :(得分:0)

这个子查询

     SELECT stats
     FROM   tasksq
     WHERE  stats = 'pending'
     ...

当然会返回'pending'。这使得声明

UPDATE tasksq
SET    stats = 'active' 
WHERE  stats = 'pending'

因此,您将 stats = 'pending' 的所有行更新为 stats = 'active'。

你可能想要

UPDATE tasksq
SET    stats = 'active' 
WHERE  jobid = (
         SELECT jobid
         FROM   tasksq
         WHERE  stats = 'pending'
         ORDER BY jobid 
         LIMIT 1
         FOR UPDATE SKIP LOCKED
         )

以 jobid 作为主键,这会更新一行(在子查询中找到的行)。

相关问题