1

以下のコードを使用して従業員 ID を 123456 から 00123456 に更新していますが、エラーが返されます。

MySQL Database Error: You can't specify target table 'tblempleave' for update in FROM clause

私のクエリ:

update tblempleave 
   set fldempid = concat('00',fldempid) 
 Where fldempid in (select fldempid from tblempleave);
4

3 に答える 3

1

table のすべての行を更新したいようですtblempleave。これが当てはまる場合は、WHERE句を削除してください。

UPDATE tblempleave 
   SET fldempid = CONCAT('00',fldempid);

BETWEEN...ANDある範囲 (1 から 100 など) の間でレコードを更新する場合は、次のような演算子を使用できます。

UPDATE tblempleave 
   SET fldempid = CONCAT('00',fldempid)
 WHERE fldempid BETWEEN 1 AND 100;
于 2013-07-08T04:36:13.050 に答える
1

ここにいる他のすべての人 (これまでのところ) は正しいです。すべての行を更新する場所は必要ありません。

具体的には、WHERE 句のサブクエリは必要ありません。これは、DB が不平を言っていることです。行を読み取っているのと同じテーブルを変更することはできません。

于 2013-07-08T04:48:02.817 に答える
1

が失敗する理由UPDATEは、 の対象となる同じテーブルを参照しているためです。UPDATE競合が発生します。これは、外側のテーブルを更新するプロセスでネストされたサブクエリから返されたデータに変更が発生し、予測できない結果が生じる可能性があるためです。

コメントで他の人がすでに指摘しているように、WHERE句のネストされた選択も、同じテーブルからすべての ID を選択しているため、たまたま何もしていません。

上記の問題に加えて、MySQL でサブクエリを使用することはお勧めできません。サブクエリのパフォーマンスが非常に悪いためです (外部クエリの各行に対して数百万回実行される可能性があるため)。

where 句がまったく必要であると仮定すると、必要に応じて上記をJOINとして (および場合によっては派生テーブルとして)書き直す方がよいでしょう。

于 2013-07-08T04:49:35.573 に答える