mysql - 自引用表时删除数据
问题描述
我在尝试清理 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 在尝试使用删除时会报错。
我真的不想花太多时间创建一个视图来引用上述查询,因为清理是一次性事件
解决方案
首先让我们缩短查询。你可以摆脱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()
);
推荐阅读
- c# - 如何使用 C# 在 Ubuntu 中的指定路径中创建文件
- android - 在kotlin android中实现JS的时刻API
- node.js - 如何运行节点应用程序的不同实例
- validation - 想要在验证提取到 gcs 存储桶中的文件名后生成一封电子邮件
- embedded-linux - 设备树中的内存映射节点未显示在 /proc/iomem 中
- flutter - 动态增长列表视图
- python - 从维基百科获取带有python标题的表格
- laravel - Laravel Eloquent whereIn 按给定的顺序返回
- sql - 如何通过在 Postgis 中提供单击位置的 X 和 Y 值来获取多边形的属性?
- python - 如何为 8 个单独的分类器创建一个函数?