从mysql表中删除所有未引用(通过外键)的记录

Ric*_*Ree 5 mysql database

我有一个地址表,它是从其他 6 个表(有时是多个表)引用的。其中一些表大约有 50 万条记录(地址表大约有 750000 条记录)。我想要运行一个定期查询,删除任何表中未引用的所有记录。

以下子查询不是一个选项,因为查询永远不会完成 - 范围太大。

delete from address where address_id not in (select ...)
and not in (select ...) and not in (select ...) ...
Run Code Online (Sandbox Code Playgroud)

我希望我可以使用外键约束,并且可以简单地删除外键约束不会阻止我的所有记录(因为没有对表的引用)。我找不到办法做到这一点(或者有吗?)。还有其他好主意来解决这个问题吗?

Dan*_*ser 0

为此,我首先创建一个临时表 (t),它是 6 个引用表中 ID 的联合,然后运行:

DELETE x FROM x LEFT JOIN t USING (ID) WHERE x.ID IS NULL;
Run Code Online (Sandbox Code Playgroud)

其中 x 是地址表。

请参阅此处的“多表语法”: http ://dev.mysql.com/doc/refman/5.0/en/delete.html

显然,您的临时表应该在 ID 上有其主键。查询和加入可能需要一些时间,但我看不到解决方法。与多子查询版本不同,它应该被优化。