我有这个查询,它只应该更新一行并返回更新的行,但它更新所有行而不是从选择返回的限制 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
在下面找到数据集的片段:
答案 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 作为主键,这会更新一行(在子查询中找到的行)。