您不能在FROM子句中为更新指定目标表'tblempleave'

时间:2013-07-08 04:32:52

标签: mysql sql sql-update

我使用以下代码将员工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);

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

此处的所有其他人(到目前为止)都是对的:您不需要更新所有行的位置。

具体来说,您不需要WHERE子句的子查询,这是数据库抱怨的内容:您无法修改从中读取行的同一个表。

答案 2 :(得分:1)

UPDATE失败的原因是因为您引用了针对UPDATE的同一个表,这会导致冲突,因为嵌套子查询返回的数据可能会发生更改更新外表的过程,从而产生不可预测的结果。

正如其他人已经在评论中指出的那样,WHERE子句中的嵌套选择也没有做任何事情,因为它正在从同一个表中选择所有ID。

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

假设你需要一个where子句,你最好将上面的内容重写为 JOIN ,(可能还有 derived table )必要时。