我使用以下代码将员工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);
答案 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 强烈>)必要时。