gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 20:55:59 24 4
gpt4 key购买 nike

我的数据库中有一个表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 - You can't specify target table 'story_category' for update in FROM clause

我该如何克服这个问题?

最佳答案

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

感谢 Peter V. Mørch请在评论中获取此建议。

示例技术来自 Baron Schwartz,originally published at Nabble ,在这里进行解释和扩展。

关于MySQL 错误 1093 - 无法在 FROM 子句中指定要更新的目标表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37629149/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com