我做了这样的事情:
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。当没有匹配项时,左外部联接为所有列返回NULL。因此,如果在WHERE子句中搜索country_id IS NULL
的情况,则只会返回其他表中没有匹配项的城市。
必须对数据库中的每个关系执行单独的查询。这可能是一件很麻烦的事,如果桌子很大,可能需要很长时间。
多年前,我曾经在一个没有外键约束的有缺陷的应用程序中(它使用MyISAM表(这样做。我每天晚上都运行一个脚本来进行所有这些孤立检查,最终它增加到了几十个查询,运行起来需要几个小时。
然后是更难的部分:一旦你找到了一些孤立的记录,你会怎么处理它们
强制执行约束要好得多,这样你就不必做那些工作了。