【问题标题】:You can't specify target table 'tblempleave' for update in FROM clause您不能在 FROM 子句中指定目标表 'tblempleave' 进行更新
【发布时间】:2013-07-05 08:22:02
【问题描述】:

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

【问题讨论】:

  • where 子句在做什么?你想做什么?
  • 就目前而言,WHERE 子句是多余的。

标签: mysql sql sql-update


【解决方案1】:

您的UPDATE 失败的原因是因为您引用了以UPDATE 为目标的同一个表,这会导致冲突,因为在更新过程中从嵌套子查询返回的数据可能会发生变化外部表,从而产生不可预知的结果。

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      看起来您想更新表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;
      

      【讨论】:

        猜你喜欢
        • 2017-01-12
        • 2012-12-03
        • 1970-01-01
        • 2016-05-19
        • 2012-03-06
        • 2015-06-08
        • 2015-07-11
        • 2016-08-25
        • 1970-01-01
        相关资源
        最近更新 更多