如何解决更新查询中的 LIMIT 1 更新所有行,而不仅仅是一个 postgres
我有这个查询,它只应该更新一行并返回更新的行,但它更新所有行而不是从选择返回的限制 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
在下面找到数据集的片段:
解决方法
这个子查询
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 作为主键,这会更新一行(在子查询中找到的行)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。