我无法进行更新查询。作为第一步,以下步骤可以正常工作:
UPDATE Tab1
SET Tab1.a = '3'
WHERE
Tab1.id IN ( 123, 456 );
Run Code Online (Sandbox Code Playgroud)
其中 id 是 Tab1 的主键。
但是,当我添加一个选择以获取 Tab1.id 必须在的值集时,我收到以下 MySQL 错误:
错误代码:1093
不能在 FROM 子句中指定目标表“Tab1”进行更新。
这是完整的查询:
UPDATE Tab1
SET Tab1.a = '3'
WHERE
Tab1.id IN (
SELECT Tab1.id
FROM Tab1, Tab2
WHERE Tab1.b = Tab2.b AND Tab1.c = '4'
);
Run Code Online (Sandbox Code Playgroud)
我看不出如何解决这个错误。
我是否被迫将此查询一分为二?
谢谢!
尝试
UPDATE Tab1 JOIN Tab2 ON Tab1.b = Tab2.b
SET Tab1.a = '3'
WHERE Tab1.c = '4'
;
Run Code Online (Sandbox Code Playgroud)
检查文档以获取更多信息(查找“多表语法”)。重要的一点是:
如果您使用涉及具有外键约束的 InnoDB 表的多表 UPDATE 语句,则 MySQL 优化器可能会以不同于其父/子关系的顺序处理表。在这种情况下,语句失败并回滚。相反,更新单个表并依赖 InnoDB 提供的 ON UPDATE 功能来相应地修改其他表。请参见第 14.3.5.4 节,“外键约束”。
您可以在SQLFiddle上查看类似的示例。