MySQL错误1093-无法在FROM子句中指定目标表进行更新

story_category我的数据库中有一个表,其中的条目已损坏。下一个查询返回损坏的条目:

SELECT * 

FROM story_category

WHERE category_id NOT IN (

SELECT DISTINCT category.id

FROM category INNER JOIN

story_category ON category_id=category.id);

我试图删除它们执行:

DELETE FROM story_category 

WHERE category_id NOT IN (

SELECT DISTINCT category.id

FROM category

INNER JOIN story_category ON category_id=category.id);

但是我得到了下一个错误:

#1093-您无法在FROM子句中指定目标表’story_category’进行更新

我该如何克服?

回答:

更新:此答案涵盖了常规错误分类。 有关如何最好地处理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

如果您绝对需要子查询,则有一种解决方法,但是由于多种原因,这很丑陋,包括性能:

UPDATE tbl SET col = (

SELECT ... FROM (SELECT.... FROM) AS x);

FROM子句中的嵌套子查询创建一个 隐式临时表 ,因此它不算作您要更新的表。

但是,请注意,从MySQL

5.7.6及更高版本开始,优化器可能会优化子查询,但仍然会给您错误。幸运的是,该

optimizer_switch变量可用于关闭此行为。尽管除了短期修复或小型一次性任务外,我不建议这样做。

SET optimizer_switch = 'derived_merge=off';

感谢 Peter V.Mørch在评论中提供的建议。

示例技术来自Baron

Schwartz,该书最初发表于Nabble,在此释义并扩展。

以上是 MySQL错误1093-无法在FROM子句中指定目标表进行更新 的全部内容, 来源链接: utcz.com/qa/412430.html

回到顶部