更新查询中的 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 为主键,这将更新一行(在子查询中找到的那一行)。
我有这个查询,它只应该更新一行和 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 为主键,这将更新一行(在子查询中找到的那一行)。