4

私はこのクエリを持っています。プログラムがリクエストの実行を終了したときに exec 値をTRUEに更新し、それをデータベースに保存して、複数の実行があるときのキューとして使用できるようにしたいのですが、このクエリはエラーになります。

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

エラー:

エラー 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

これは、2つの別々のクエリとして実行する必要があります。また、プログラムがキューで動作している「モーター」の主キーを追跡し、それに基づいて更新しないのはなぜですか?

于 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はそれらの行の 1 つだけを更新するのに対し、これはすべてを更新することです。

于 2012-11-22T07:44:13.387 に答える