我有一个最初位于 MyISAM 中的数据库,因此没有外键约束。结果,有相当多的孤立行,其中外键引用的记录已被删除。
为了解决这个问题,我决定转换为 InnoDB 并添加外键,并使用 CASCADE 进行更新和删除。但是,当我尝试添加外键时,出现如下错误(来自 Navicat 8 控制台):
1452 - Cannot add or update a child row: a foreign key constraint fails
(`database`.`#sql-1358_38d`, CONSTRAINT `#sql-1358_38d_ibfk_1` FOREIGN KEY
(`manufacturerID`) REFERENCES `manufacturer` (`ID`) ON DE)
我知道它为什么这样做 - 因为孤立的行。有没有办法让约束的创建自动清除这些行?遍历所有表格并找到孤立的行将需要很长时间。
这是我正在运行的查询之一,以防万一:
ALTER TABLE part_number ADD CONSTRAINT
FOREIGN KEY(manufacturerID)
REFERENCES manufacturer(ID)
ON DELETE CASCADE
ON UPDATE CASCADE;
最佳答案
编写一个查找孤立行的查询,然后用它来删除。例如
SELECT part_number.id FROM part_number LEFT JOIN manufacturer ON (manufacturer.ID = part_number.manufacturerID) 其中 manufacturer.ID 为 NULL
关于MySQL InnoDB - 当数据已经存在违反它时创建 CASCADE 外键约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4216234/