2012-08-10 48 views
10

我们有一个包含数百个表的数据库。使用foreign_keys的表使用INNODB。MySQL发现无效的外键

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

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

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

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

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

搜索谷歌有点...令人惊讶的是我什么也没找到。

+0

你是什么意思,'无效'?孤儿记录?带有FK的表指向不再存在的表? – 2012-08-10 18:14:21

+0

您可以让您的数据库自动执行此操作(取决于您正在使用的数据库引擎)并将其设置为ON DELETE CASCADE,以保持参照完整性。 – 2012-08-10 18:18:40

+0

除了stefans评论,请注意,您可以取消或更新儿童,您不必删除它。 – TomDunning 2012-08-10 18:21:01

回答

12

如果数据已经在和你没有设置FK约束或级联删除父,那么你只是想:

SELECT * FROM children WHERE my_fk_id NOT IN (select id from parents); 
+1

'SELECT t1。* FROM table1 t1 LEFT JOIN table2 t2 ON t1.parent_id = t2.id WHERE t2.id IS NULL' – DavidS 2012-08-10 18:23:10

+0

@Isotope数据已存在,但我们已经有了fk约束。 – 2012-08-10 18:48:08

+0

这非常适合在桌子上查找无效键。但是,我正在寻找一种工具来查找整个数据库中所有表的这些工具。 – 2012-08-10 19:00:02