mySQL 修复新的数据库完整性实现外键

mySQL repair new database integrity implementing foreign keys

我的问题很简单。我得到了一个相当大的工作数据集的大约 95%。然后我编写了一个解析器,将我的数据设置为 CSV,编写了我的批量加载,并设置了所有内容并保存了外键。

现在,丢失的 5% 的一部分来自一个 table,(比如 Items),它曾经包含另一个 table,(比如 Users)的信息) 仍然有。由于 table 之间的引用完整性被破坏,因此无法添加外键约束,抛出 error 1452,因为后者 table 引用了前者中丢失的记录。

现在,我不介意失去这5%,想要拥有那95%。有没有一种简单的方法可以在添加外键时丢弃损坏的记录?或者我可以通过一些 SQL 查询来做到这一点吗?或者我是否必须返回并重新解析所有内容以丢弃不良记录?我觉得第一个或第二个应该是一个选择。但我就是找不到它,因为我不是数据库管理员...我是否遗漏了一些非常简单的东西?

您可以使用 INSERT IGNORE ...,或者如果您使用批量数据加载,请使用 LOAD DATA INFILE 'filename' IGNORE ... 或者如果您使用 mysqlimport 程序,则有一个 --ignore 选项。

这样做是在尝试导入时出现错误时跳过任何单独的行,并继续下一行。

另一种方法是在使用 INSERTLOAD DATA INFILE 之前使用 SET foreign_key_checks=0;。这将允许加载行,即使它们引用了不存在的值。当然,这会导致另一个问题:您将拥有“孤儿”数据行,因为它们的父项丢失了。这些孤立行往往未被发现,因为它们自然会从连接中省略。

您可以像这样检测孤立行:

SELECT Items.*
FROM Items
LEFT OUTER JOIN Users ON Items.user_id = Users.id
WHERE Users.id IS NULL;

这种查询 returns 仅查询在 Users 中没有匹配行的 Items 中的行,因此 Users.* 的所有列的外连接 returns NULL。然后,您可以查看这些行并决定要对这些行执行的操作,例如更新它们以将 user_id 更改为其他内容,或者可能只是删除这些行。