Postgresql 更新查询中的限制1将更新所有行,而不仅仅是一个postgres
我有一个查询,它应该只更新一行并返回更新的行,但它更新所有行,而不是从select返回的limit 1。 我试图在一行上实现显式锁定,这样当选择stats=pending(有点像队列)的任何行时,都不会发生并发读取/选择 以下是查询:Postgresql 更新查询中的限制1将更新所有行,而不仅仅是一个postgres,postgresql,limit,updates,Postgresql,Limit,Updates,我有一个查询,它应该只更新一行并返回更新的行,但它更新所有行,而不是从select返回的limit 1。 我试图在一行上实现显式锁定,这样当选择stats=pending(有点像队列)的任何行时,都不会发生并发读取/选择 以下是查询: BEGIN; UPDATE tasksq SET stats = 'active' WHERE stats = ( SELECT stats FROM tasksq WHERE stats =
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'
...
当然会返回“待定”。这就说明了这一点
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是主键,它会更新一行(在子查询中找到的那一行)。是,这很好,但我只希望它更新一行,而不是所有行,这就是为什么我设置了限制1,并希望将该行返回给我好的。这当然不是“好的”,因为您不想更新所有“挂起”行。我已经用我认为你想要的更新了我的答案。看来你只是把
stats
和jobid
搞混了。