MySQL 5.7 错误 (1093: You can't specify target table ___ for update in FROM 子句) - 通常的解决方案不起作用

Posted

技术标签:

【中文标题】MySQL 5.7 错误 (1093: You can\'t specify target table ___ for update in FROM 子句) - 通常的解决方案不起作用【英文标题】: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 【参考方案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 世界中。

以上是关于MySQL 5.7 错误 (1093: You can't specify target table ___ for update in FROM 子句) - 通常的解决方案不起作用的主要内容,如果未能解决你的问题,请参考以下文章