[MySQL] You can't specify target table 'table name' for update in FROM

79 阅读1分钟

这个错误通常出现在 MySQL 中,表示在更新查询中使用了目标表作为子查询的源表,而 MySQL 不允许这样做。

例如,下面的 SQL 查询就会出现这个错误:

UPDATE app_detailed_info_gp
SET is_deleted = 1
WHERE id IN (
    SELECT id FROM app_detailed_info_gp WHERE is_deleted = 0
    ORDER BY created_at DESC LIMIT 10
);

这个查询的目的是将 app_detailed_info_gp 表中最新的 10 条未删除记录的 is_deleted 字段设置为 1,以标记这些记录为已删除状态。但是,由于子查询中使用了目标表 app_detailed_info_gp,因此会出现上述错误。

为了避免这个错误,可以将子查询中的目标表改为临时表,如下所示:

UPDATE app_detailed_info_gp
SET is_deleted = 1
WHERE id IN (
    SELECT tmp.id FROM (
        SELECT id FROM app_detailed_info_gp WHERE is_deleted = 0
        ORDER BY created_at DESC LIMIT 10
    ) AS tmp
);

在这个查询中,子查询的结果被存储在一个临时表 tmp 中,然后在外部查询中使用这个临时表进行更新操作。这样就避免了在更新查询中使用目标表作为子查询的源表,从而避免了上述错误。