如何检查 MySQL 中关系的完整性?

How do I check the integrity of a relationship in MySQL?

我是这样做的:

SET foreign_key_checks = 0;
//many different operations on several tables
SET foreign_key_checks = 1;

如何验证我的整个基础是否一致?我想确保所有关系都得到妥善维护。例如,如果我删除一个id为:20的“国家”,我想确保没有“城市”有不存在的关系“country_id”= 20.

如果你不这样做会更容易 SET foreign_key_checks = 0。如果你保持约束强制执行,那么你就不会产生不一致或损坏的引用。如果你尝试,你会得到一个错误。因此,如果参照完整性很重要,您应该考虑不要关闭 FK 检查。

如果您确实认为存在不一致,则必须执行如下查询以验证没有引用不再存在的父项的“孤儿”:

SELECT cities.city_id
FROM cities
LEFT OUTER JOIN countries
 ON cities.country_id = countries.country_id
WHERE countries.country_id IS NULL;

如果 JOIN 条件基于 country_id 的相等性,这意味着 country_id 不能为 NULL。左外连接 returns NULL 当没有匹配时所有列。因此,如果您在 WHERE 子句中搜索 country_id IS NULL 的情况,这只会 return 个在其他 table.

中没有匹配的城市

您必须对数据库中的每个关系进行单独的查询。这可能非常繁琐,如果 table 非常大,可能需要很长时间。

多年前,我曾经不得不在一个没有外键约束的错误应用程序中执行此操作(它使用 MyISAM tables)。我 运行 一个脚本每晚都做所有这些 orphan-checks,最终它增长到几十个查询,并且花了几个小时 运行。

然后是更难的部分:一旦你找到了一些孤立记录,你会怎么做?你会删除孤立记录吗?您是否更改他们的外键列以引用仍然存在的父记录?你恢复父记录吗?它可以是这些选项中的任何一个,并且您必须让具有知识和权威的人逐个审查孤立记录,以选择如何解决问题。

最好强制执行约束,这样您就不必做这些工作了。