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

LIMIT 1 in update query updates all rows instead of just one postgres

我有这个查询,它只应该更新一行和 return 更新的行,但它更新所有行而不是从 return 编辑的限制 1 =25=]。 我试图实现的是对一行进行显式锁定,以便在任何行 selected with stats = pending(有点像队列)

时不会发生并发 reads/selects

这是查询:

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 查询那么它确实有效 returns 1 row

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

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

这个子查询

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

当然会return'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 为主键,这将更新一行(在子查询中找到的那一行)。