奇怪的 "Cannot add or update a child row: a foreign key constraint fails" 错误
Strange "Cannot add or update a child row: a foreign key constraint fails" error
我目前正在将 MySQL 数据库中的一个主要 ID 列从 INT
转换为 STRING
。过程很简单,
- 删除引用该列的所有外键(您不能使用外键对其进行修改)
- 修改 ID 列以及在其他 tables
中引用它的所有列
- 重新添加外键
除第 3 步中的 1 个外键外,一切正常,我收到以下错误,
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`cp`.`#sql-1_13`, CONSTRAINT `widgets_candidate_id_foreign` FOREIGN KEY (`candidate_id`) REFERENCES `candidates` (`id`))
我对这个错误并不陌生。这通常意味着我的列名有误或其他原因,但在这种情况下,我很确定我没有,除非我要发疯了。请参阅下面的 table 导出,
CREATE TABLE `candidates` (
`id` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
---- SNIP ----
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
CREATE TABLE `widgets` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`candidate_id` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
---- SNIP ----
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2203 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC
而 MODIFY
查询是,
ALTER TABLE `widgets`
ADD CONSTRAINT widgets_candidate_id_foreign FOREIGN KEY (`candidate_id`) REFERENCES `candidates` (`id`);
我认为唯一 可以 是 widgets
table 上的 ROW_FORMAT=DYNAMIC
。 candidate_id
是否可以存储在页外,从而导致问题?
有什么想法吗?
谢谢。
您可以向已包含数据的 table 添加外键,但前提是 parent [=23= 中的每一行都存在 child 行].根据您收到的错误,我认为您的 child table 中有一个值在您的 parent table 中已被弃用。
您可以进一步研究 Here。
您可以使用左联接或 IN 来查看哪些值存在于 child table 中,但不存在于 parent 中。还有其他方法可以解决这个问题,但在你的特定环境中,你如何解决这个问题才是真正有意义的。
我目前正在将 MySQL 数据库中的一个主要 ID 列从 INT
转换为 STRING
。过程很简单,
- 删除引用该列的所有外键(您不能使用外键对其进行修改)
- 修改 ID 列以及在其他 tables 中引用它的所有列
- 重新添加外键
除第 3 步中的 1 个外键外,一切正常,我收到以下错误,
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`cp`.`#sql-1_13`, CONSTRAINT `widgets_candidate_id_foreign` FOREIGN KEY (`candidate_id`) REFERENCES `candidates` (`id`))
我对这个错误并不陌生。这通常意味着我的列名有误或其他原因,但在这种情况下,我很确定我没有,除非我要发疯了。请参阅下面的 table 导出,
CREATE TABLE `candidates` (
`id` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
---- SNIP ----
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
CREATE TABLE `widgets` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`candidate_id` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
---- SNIP ----
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2203 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC
而 MODIFY
查询是,
ALTER TABLE `widgets`
ADD CONSTRAINT widgets_candidate_id_foreign FOREIGN KEY (`candidate_id`) REFERENCES `candidates` (`id`);
我认为唯一 可以 是 widgets
table 上的 ROW_FORMAT=DYNAMIC
。 candidate_id
是否可以存储在页外,从而导致问题?
有什么想法吗?
谢谢。
您可以向已包含数据的 table 添加外键,但前提是 parent [=23= 中的每一行都存在 child 行].根据您收到的错误,我认为您的 child table 中有一个值在您的 parent table 中已被弃用。
您可以进一步研究 Here。
您可以使用左联接或 IN 来查看哪些值存在于 child table 中,但不存在于 parent 中。还有其他方法可以解决这个问题,但在你的特定环境中,你如何解决这个问题才是真正有意义的。