4

我有这个查询,我希望能够在我的程序完成执行请求时将 exec 值更新为TRUE并将其保存到我的数据库中,以便在我有多个执行时将其用作队列,但是,每当我尝试使用这个查询它给了我一个错误。

UPDATE motor 
SET exec=1 
where time=(SELECT max(time) 
            FROM motor 
            WHERE exec=0);

错误:

ERROR 1093 (HY000): 您不能在 FROM 子句中指定目标表 'motor' 进行更新

我怎样才能做到这一点?

4

4 回答 4

12

这是因为您的 UPDATE 可能是循环的。

使用此代码代替:

UPDATE motor 
SET exec = 1 
WHERE exec = 0 
ORDER BY time DESC 
LIMIT 1;
于 2012-11-21T22:02:43.790 回答
0

您必须将其作为两个单独的查询来执行。另外,你为什么不让你的程序跟踪它在队列中工作的“电机”的主键并基于它进行更新?

于 2012-11-21T22:02:15.950 回答
0

您应该将从 SELECT 语句中获得的值分配给如下变量:

DECLARE varTime datetime;
SELECT varTime := max(time) FROM motor WHERE exec=0;
UPDATE motor SET exec=1 where time= varTime 

我不太确定语法,因为我主要在 MS SQL Server 上工作,但我知道它应该是一样的。

于 2012-11-21T22:07:38.473 回答
-1

您接受的答案是正确的。是否也可以通过以下方式获得相同的结果:

UPDATE
  motor inner join
  (SELECT max(time) as time
   FROM motor 
   WHERE exec=0) mx on motor.time = mx.time 
SET motor.exec=1;

唯一的区别是,如果有多个具有相同最大值的行,LIMIT 1将仅更新其中一行,而这将更新所有行。

于 2012-11-22T07:44:13.387 回答