嵌套 UPDATE 查询的问题

Pie*_*tro 2 mysql update

我无法进行更新查询。作为第一步,以下步骤可以正常工作:

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)

我看不出如何解决这个错误。
我是否被迫将此查询一分为二?

谢谢!

dez*_*zso 5

尝试

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上查看类似的示例。