这个错误通常出现在 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 中,然后在外部查询中使用这个临时表进行更新操作。这样就避免了在更新查询中使用目标表作为子查询的源表,从而避免了上述错误。