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

看起来你想更新表的每一行tblempleave。如果这是真的,那么只需删除该WHERE子句:

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

如果要更新某个范围(例如 1 到 100)之间的记录,可以使用BETWEEN...AND如下运算符:

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子句中的 Nested Select 也恰好没有做任何事情,因为它从同一个表中选择了所有 ID。

除了上面提到的问题之外,永远不建议在 MySQL 中使用子查询,因为它们的性能非常糟糕(因为它们对外部查询中的每一行都执行,可能会执行数百万次)。

假设您根本需要 where 子句,您最好根据需要将上面的内容重写为JOIN(并可能作为派生表)。

于 2013-07-08T04:49:35.573 回答