我遇到了一个奇怪的问题。我试图添加一个外键到一个引用另一个表,但由于某种原因失败了。以我对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

当前回答

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

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

其他回答

清空两个表的数据并运行该命令。它会起作用的。

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

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

这也发生在设置父外键时。Id到child。列如果是子元素。列的值已经为0,并且没有父元素。Id值为0

你需要确保每个孩子。列为NULL或在parent.id中存在值

现在我读了nos写的声明,这就是他所确认的。

你只需要回答一个问题

您的表已经存储数据了吗?(特别是表中包含外键。)

如果答案是肯定的,那么您需要做的唯一一件事就是删除所有记录,然后您可以自由地向表中添加任何外键。

删除指令:从子表(包括外键表)到父表。

不能在数据条目后添加外键的原因是由于表不一致,您将如何处理一个新的外键对前数据填充的表?

如果答案是否定的,那么按照其他指示进行。

同样的问题我遇到过三次。在每种情况下,都是因为我的一个(或多个)记录不符合新的外键。在尝试添加外键本身之前,您可能希望更新现有记录以遵循外键的语法约束。下面的例子通常可以隔离问题记录:

SELECT * FROM (tablename)
    WHERE (candidate key) <> (proposed foreign key value) 
        AND (candidate key) <> (next proposed foreign key value)

对于外键中的每个值,在查询中重复AND(候选键)<>(下一个建议的外键值)。

如果您有大量的记录,这可能会很困难,但如果您的表相当小,这应该不会花费太长时间。我在SQL语法方面不是很出色,但这始终为我隔离了问题。