MySQL InnoDB - 当数据已经存在违反它时创建 CASCADE 外键约束?

标签 mysql foreign-keys innodb

我有一个最初位于 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/

相关文章:

mysql - 对行进行排序以均匀分布公共(public)记录

mysql 在两列上使用 FOREIGN KEY

mysql - 如何让 Navicat mySQL (Non-Commercial) 表默认为 InnoDB 引擎?

mysql - InnoDB插件版本命令?

mysql - 为什么MySQL在查找不等于时会忽略空值?

mysql - 创建表返回错误1064语法错误

mysql - 'a1.location' 中的未知列 'where clause'

mysql - 无法在 MySQL 中创建外键约束

mysql - 这种情况下有必要使用外键吗?

mysql - Yii 框架——InnoDB 与 MyISAM