Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 更新查询中的限制1将更新所有行,而不仅仅是一个postgres_Postgresql_Limit_Updates - Fatal编程技术网

Postgresql 更新查询中的限制1将更新所有行,而不仅仅是一个postgres

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 =

我有一个查询,它应该只更新一行并返回更新的行,但它更新所有行,而不是从select返回的limit 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'
     ...
当然会返回“待定”。这就说明了这一点

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
搞混了。