首页 > 解决方案 > 自引用表时删除数据

问题描述

我在尝试清理 MySQL 表中的数据时遇到了问题。问题是我们需要使用子查询中的表来识别需要删除的内容。

DELETE 
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN (
  SELECT person.person_ref
  FROM person
  JOIN dates ON dates.person_ref = person.person_ref AND dates.event_ref = 14
  WHERE dates.date < CURDATE()
)

Subquery给了所有日期早于今天的人。事件引用列表是我们要删除的事件列表,其中不包括 event_ref = 14

将查询视为 SELECT 会返回我们想要删除的所有内容,但 MySQL 在尝试使用删除时会报错。

我真的不想花太多时间创建一个视图来引用上述查询,因为清理是一次性事件

标签: mysqlsql-delete

解决方案


首先让我们缩短查询。你可以摆脱person这里的桌子;你没有任何用处。

DELETE 
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN
(
  SELECT person_ref
  FROM dates 
  WHERE event_ref = 14 AND date < CURDATE()
);

现在 MySQL 不喜欢直接访问它正在删除的表。在 MySQL 中,您必须将表包装在伪子查询中:

DELETE 
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN
(
  SELECT person_ref
  FROM (SELECT * FROM dates) d
  WHERE event_ref = 14 AND date < CURDATE()
);

推荐阅读