【问题标题】:MySQL 5.7 error (1093: You can't specify target table ___ for update in FROM clause) - usual solution not workingMySQL 5.7 错误 (1093: You can't specify target table ___ for update in FROM 子句) - 通常的解决方案不起作用
【发布时间】:2016-02-17 04:36:57
【问题描述】:

我有一个表“员工”,我正在尝试将一些属性(例如薪水)设置为与表中的其他值相同的值。我对这个错误的理解是,可以通过以下解决方法来避免它,使用临时表:

UPDATE employees
SET salary=(SELECT salary FROM (SELECT * FROM employees WHERE employee_id= '123') AS t1)
WHERE employee_id='456';

但是,当我尝试此操作时,我仍然收到相同的错误代码(“无法在 FROM 子句中指定目标表 'employees' 进行更新”)。这里还有其他问题吗?

【问题讨论】:

  • 它正在处理sqlfiddle
  • 如果它应该在 MySQL 上运行,是否有某种原因无法在 MySQL 上运行......?我不是很熟悉。
  • 因为虽然它不是在同一个表上连接的更新,但它可能需要不同的别名?
  • 服务器版本 5.7.9,工作台版本 6.3.5

标签: mysql mysql-error-1093


【解决方案1】:

问题是mysql 5.7中的functional change,滚动到最后

优化器现在处理 FROM 子句中的派生表和视图 以一致的方式更好地避免不必要的物化和 能够使用产生更高效率的下推条件 执行计划。但是,对于 DELETE 或 UPDATE 等语句, 修改表,使用派生表的合并策略 以前被具体化可能会导致 ER_UPDATE_TABLE_USED 错误:

使用 JOIN 或强制 otimizer 的行为与以前版本中的行为类似:

SET optimizer_switch = 'derived_merge=off';

【讨论】:

  • 要清楚,该行会超出查询,对吗?根据该文档,它似乎绝对应该使用它,但它仍然没有..
  • @filaments 在运行查询之前单独运行。Doesnt work 意味着什么?
  • 仍然收到相同的错误消息(“您无法在 FROM 子句中指定目标表 'employees' 进行更新”)。我在查询之前单独运行它。我想我可以使用 join 并完成它,但我希望我也能弄清楚这部分。
  • @filaments 奇怪,尝试在外部 SELECT 之后添加一个 DISTINCT 以强制派生表。
  • 仍然是相同的错误代码。我可能生活在一些奇怪的平行 MySQL 世界中。
猜你喜欢
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多