gpt4 book ai didi

mysql - 错误 : Cannot add foreign key constraint

转载 作者:行者123 更新时间:2023-11-30 21:51:43 25 4
gpt4 key购买 nike

问题

我有两张 table 。第一个已填充;第二个是空的。

我希望第二个有一个引用第一个中的列的外键。

我的理解是应该可以,只要:

  • 两个表具有相同的引擎
  • 两列具有相同的数据类型
  • 两列的长度
  • 两列具有相同的排序规则
  • 两列具有相同的字符集
  • 父列有一个唯一
  • 父列对于子列中的每个值都有一个匹配值

在我的例子中,所有这些条件都成立,但 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 表不兼容。会是什么?

注意事项

以前也有人问过类似的问题,但他们的回答并没有解决这个特殊情况下的问题。

最佳答案

您需要为您的 Foreign KEY 允许 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

关于mysql - 错误 : Cannot add foreign key constraint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46917858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com