我有这个查询,我希望能够在我的程序完成执行请求时将exec值更新为 TRUE 并将其保存到我的数据库,以便将其用作队列但是,每当我尝试使用此查询时,它都会出现错误。
UPDATE motor
SET exec=1
where time=(SELECT max(time)
FROM motor
WHERE exec=0);
错误:
错误1093(HY000):您无法在FROM子句中指定目标表'motor'进行更新
我该怎么做?
答案 0 :(得分:11)
这是因为你的UPDATE可能会循环。
使用此代码代替:
UPDATE motor
SET exec = 1
WHERE exec = 0
ORDER BY time DESC
LIMIT 1;
答案 1 :(得分:0)
您必须将此作为两个单独的查询。另外,为什么不让你的程序跟踪它在队列中工作的“电机”的主键并根据它进行更新?
答案 2 :(得分: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,但我知道它应该是相同的。
答案 3 :(得分:-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
将仅更新其中一行,而这将更新所有行。