更新:这个答案涵盖了一般错误分类。有关如何最好地处理OP的确切查询的更具体答案,请参阅此问题的其他答案
在 MySQL 中,您不能修改在 SELECT 部分中使用的同一个表。
此行为记录在:http://dev.mysql.com/doc/refman/5.6/en/update.html
也许您可以将表连接到其本身
如果逻辑足够简单,可以重新调整查询,则丢失子查询并使用适当的选择标准将表连接到自身。这将导致 MySQL 将表视为两个不同的事物,从而允许进行破坏性更改。
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
或者,尝试将子查询更深地嵌套到 from 子句中......
如果您绝对需要子查询,有一个解决方法,但它是
丑陋有几个原因,包括性能:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
FROM 子句中的嵌套子查询创建一个隐式临时
桌子,因此它不算作您正在更新的同一个表。
...但要注意查询优化器
然而,请注意,从MySQL 5.7.6之后,优化器可能会优化子查询,但仍然会给出错误。幸运的是,optimizer_switch
变量可用于关闭此行为;尽管我不建议将其视为短期修复或小型一次性任务。
SET optimizer_switch = 'derived_merge=off';
谢谢彼得·V·莫希对于评论中的建议。
示例技术来自 Baron Schwartz,最初发表于 Nabble,在这里进行解释和扩展。