我有两张桌子。第一个是人口稠密的;第二个是空的。
我希望第二个拥有引用第一个列的外键。
我的理解是,它应该是可能的,只要:
就我而言,所有这些条件都是正确的,但MySQL仍然不允许外键关系。
还需要满足哪些其他条件?
注意:此示例概述了情况,但不会重现错误。
架构:
CREATE TABLE `parents` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4
CREATE TABLE `kids` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`parent_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4
parents
已填充。 kids
是空的。
kids.parent_id
无法成为parents.id
的外键:
ALTER TABLE `kids` ADD FOREIGN KEY (`parent_id`) REFERENCES `parents` (`id`);
-- Error : Cannot add foreign key constraint
MySQL没有提供错误的原因; SHOW ENGINE INNODB STATUS
不返回任何内容:
SHOW ENGINE INNODB STATUS;
-- [Type] [Name] [Status]
-- InnoDb
我拥有所需的数据库权限。
我已经仔细检查过列(甚至表格)具有相同的排序规则(字符集不适用于INT列):
ALTER TABLE `parents` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
ALTER TABLE `parents` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
ALTER TABLE `parents` MODIFY `id` int(10) unsigned NOT NULL AUTO_INCREMENT COLLATE utf8mb4_unicode_520_ci;
ALTER TABLE `kids` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
ALTER TABLE `kids` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
ALTER TABLE `kids` MODIFY `parent_id` int(10) unsigned NOT NULL COLLATE utf8mb4_unicode_520_ci;
ALTER TABLE `kids` ADD FOREIGN KEY (`parent_id`) REFERENCES `parents` (`id`);
-- Error : Cannot add foreign key constraint
之前我已经设置了很多外键,但在这种情况下显然有些不同。
上面的示例不会重现错误,这意味着架构是正确的。因此,除了模式之外的东西必须导致错误。
parents
表或数据中必须存在隐藏的设置或条件,这使得它与kids
表不兼容。它可能是什么?
以前曾提出类似的问题,但他们的答案并没有解决这个特殊情况下的问题。
答案 0 :(得分:0)
您需要允许外国人使用NULL
CREATE TABLE `kids` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`parent_id` int(10) unsigned NULL, // <<== HERE
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`),
CONSTRAINT parent_fk FOREIGN KEY (parent_id)
REFERENCES parents(parent_id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4