19

我们有一个包含几百个表的数据库。使用 foreign_keys 的表使用 INNODB。

mysqldump有时我们在开发、阶段和生产数据库之间传输数据(使用 的单个表)。mysqldump禁用所有外键检查以方便导入数据。

因此,随着时间的推移,我们的一些非生产数据库最终会出现一些孤立记录。

我正要编写一个脚本来查找和检测整个 MySQL 数据库的任何无效(指向丢失记录的键)外键。

我知道我可以编写一个查询来逐个检查每个表和 fkey,但我想可能已经有一个工具可以做到这一点。

我会在编写这样的脚本之前检查一下是否已经有一个。

谷歌搜索了一下......令人惊讶的是我什么也没找到。

4

2 回答 2

22

如果数据已经存在并且您没有设置 fk 约束或级联来删除父级,那么您只需要:

SELECT * FROM children WHERE my_fk_id NOT IN (select id from parents);
于 2012-08-10T18:19:19.337 回答
0

这些其他答案对于小表来说很好,但我认为它们在 O(n^2) 中运行,这对于大型数据库可能并不理想。相反,我使用了左连接:

SELECT * FROM children c LEFT JOIN parents p ON p.id=c.parent_id WHERE p.id IS NULL AND c.parent_id IS NOT NULL;

请注意,您可能不需要最后一个非空条件,我这样做是因为我想排除没有父母的孩子(在我的特定场景中是一个有效案例)

于 2021-11-17T21:31:46.980 回答