2012-11-21 110 views
4

我有這個查詢,我希望能夠更新執行值爲真正當我的程序完成執行請求並將其保存到我的數據庫使用它作爲隊列但是當我有多次執行時,每當我嘗試使用這個查詢時,它都會給我一個錯誤。mySQL更新值使用最大日期

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

錯誤:

ERROR 1093 (HY000): You can't specify target table 'motor' for update in FROM clause

我怎樣才能做到這一點?

回答

10

這是因爲您的UPDATE可能是騎車。

使用此代碼,而不是:

UPDATE motor 
SET exec = 1 
WHERE exec = 0 
ORDER BY time DESC 
LIMIT 1; 
+0

這工作得很好,謝謝! –

+0

不客氣。 – zessx

0

你必須做這兩個單獨的查詢。此外,爲什麼你沒有讓程序跟蹤它在隊列中工作的「電機」的主鍵,並根據這個更新進行更新?

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上工作,但我知道它應該是相同的。

0

您接受的答案是正確的。是不是也有可能獲得與此相同的結果:

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將只更新這些行之一,而這將更新所有。