Mysql 如何修复数据以便将外键添加回数据库

Mysql 如何修复数据以便将外键添加回数据库,mysql,foreign-keys,Mysql,Foreign Keys,我刚刚发现,我的数据库在过去几个月里在几个服务器之间移动,在其中一个数据库转储中被转换为myisam,所有外键约束都被忽略了。我已经用一个php脚本将所有的表转换回innodb,但是现在我发现有一半的约束无法添加 Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`identicar2`.<result 2 when explaining filename '#sql-2a

我刚刚发现,我的数据库在过去几个月里在几个服务器之间移动,在其中一个数据库转储中被转换为myisam,所有外键约束都被忽略了。我已经用一个php脚本将所有的表转换回innodb,但是现在我发现有一半的约束无法添加

Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`identicar2`.<result 2 when explaining filename '#sql-2a7_c0'>, CONSTRAINT `#sql-2a7_c0_ibfk_1` FOREIGN KEY (`feature_sk`) REFERENCES `tbl_feature_list` (`feature_sk`))
我现在迷路了,我不能手动浏览成千上万的记录。要使我的数据库恢复正常状态,最好做什么


如果您愿意,我可以提供表结构,但我认为任何解决方案都与确切的结构无关

最简单的解决方案:包含您可能希望保留的数据丢失的明显危险

UPDATE table
SET fkColumn = NULL
WHERE fkColumn NOT IN (SELECT referenceColumn FROM referencedTable)
如果您只是想找到它们:

SELECT *
FROM table
WHERE fkColumn NOT IN (SELECT referenceColumn FROM referencedTable)

如果fkColumn的值未引用任何现有父行,则无论如何它都是无效数据,因此为空不重要:-@BillKarwin在数据库的当前状态下,这些数据可能意义不大,但您可能在某个时候删除了引用的记录,并且可能希望恢复数据库的旧版本,以至少从理论上找到这些数据。是的,我知道我的评论只是理论上的。在现实生活中,我们希望像您选择的示例中那样识别所有不匹配的fk值,然后根据具体情况决定如何处理它们。效果很好,我最终使用了DELETE FROM table,其中。。。进行实际的清洁。感谢您提供的优雅解决方案: