我遇到了一个奇怪的问题。我试图添加一个外键到一个引用另一个表,但由于某种原因失败了。以我对MySQL有限的知识,唯一可能怀疑的是,在另一个表上有一个外键引用了我试图引用的表。

我已经在两个表上做了一个SHOW CREATE TABLE查询,sourcecodes_tags是带外键的表,sourcecodes是引用的表。

CREATE TABLE `sourcecodes` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `user_id` int(11) unsigned NOT NULL,
 `language_id` int(11) unsigned NOT NULL,
 `category_id` int(11) unsigned NOT NULL,
 `title` varchar(40) CHARACTER SET utf8 NOT NULL,
 `description` text CHARACTER SET utf8 NOT NULL,
 `views` int(11) unsigned NOT NULL,
 `downloads` int(11) unsigned NOT NULL,
 `time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`),
 KEY `user_id` (`user_id`),
 KEY `language_id` (`language_id`),
 KEY `category_id` (`category_id`),
 CONSTRAINT `sourcecodes_ibfk_3` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `sourcecodes_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `sourcecodes_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

CREATE TABLE `sourcecodes_tags` (
 `sourcecode_id` int(11) unsigned NOT NULL,
 `tag_id` int(11) unsigned NOT NULL,
 KEY `sourcecode_id` (`sourcecode_id`),
 KEY `tag_id` (`tag_id`),
 CONSTRAINT `sourcecodes_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1

下面是生成错误的代码:

ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE

当前回答

我正在准备这个解决方案,这个例子可能会有帮助。

我的数据库有两个表(email和credit_card),它们的id都有主键。另一个表(客户端)将这些表id引用为外键。除了客户数据之外,我有理由拥有电子邮件。

首先,我为引用的表(email, credit_card)插入行数据,然后获得每个表的ID,这些ID在第三个表(客户端)中需要。

如果你不先在引用的表中插入行,当你在第三个引用外键的表中插入新行时,MySQL将不能进行相应的操作。

如果首先插入引用表的引用行,然后插入引用外键的行,则不会发生错误。

希望这能有所帮助。

其他回答

我在使用Laravel和eloquent时得到这个错误,试图创建外键链接会导致1452。问题在于链接表中缺少数据。

请看这里的例子:http://mstd.eu/index.php/2016/12/02/laravel-eloquent-integrity-constraint-violation-1452-foreign-key-constraint/

截断表,然后尝试添加FK约束。

我知道这个解决方案有点尴尬,但它确实100%有效。但我同意这不是解决问题的理想方案,但我希望它能有所帮助。

在我的案例中,我创建了一个具有相同结构的新表,创建了与其他表的关系,然后从有问题的旧表中提取CSV格式的数据,然后将CSV导入到新表中并禁用外键检查和禁用导入中断,我的所有数据都成功插入到没有问题的新表中,然后删除旧表。

这对我很管用。

我有同样的问题,并找到解决方案,在外键列上放置NULL而不是NOT NULL。下面是一个查询:

ALTER TABLE `db`.`table1`
ADD COLUMN `col_table2_fk` INT UNSIGNED NULL,
ADD INDEX `col_table2_fk_idx` (`col_table2_fk` ASC),
ADD CONSTRAINT `col_table2_fk1`
FOREIGN KEY (`col_table2_fk`)
REFERENCES `db`.`table2` (`table2_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

MySQL已经执行了这个查询!

试试这个

SET foreign_key_checks = 0;

ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE

SET foreign_key_checks = 1;