为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL错误1452-无法添加或更新子行:外键约束失败

MySQL错误1452-无法添加或更新子行:外键约束失败

心有法竹 2019-06-17 15:50:47
我有个奇怪的问题。我试图向一个引用另一个表的表中添加一个外键,但由于某种原因它失败了。就我对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=latin1CREATE 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 CASCADEMySQL错误1452-无法添加或更新子行:外键约束失败
查看完整描述

3 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

我的MySQL数据库也有同样的问题,但最后,我得到了一个对我有用的解决方案。
因为在我的表中,从MySQL的角度来看,一切都很好(两个表都应该使用InnoDB引擎,并且每个列的数据类型应该是相同的类型,参与外键约束)。
我所做的唯一的事情就是禁用外键检查,然后在执行外键操作后启用它。
我采取的步骤:

SET foreign_key_checks = 0;
alter table tblUsedDestination add constraint f_operatorId foreign key(iOperatorId) references tblOperators (iOperatorId); Query
OK, 8 rows affected (0.23 sec) Records: 8  Duplicates: 0  Warnings: 0
SET foreign_key_checks = 1;


查看完整回答
反对 回复 2019-06-17
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

使用NOT IN查找约束的位置约束:

SELECT column FROM table WHERE column NOT IN (SELECT intended_foreign_key FROM another_table)

因此,更具体而言:

SELECT sourcecode_id FROM sourcecodes_tags WHERE sourcecode_id NOT IN (SELECT id FROM sourcecodes)

编辑:INNOT IN运算符比JOIN运算符,以及更容易构建和重复的操作。


查看完整回答
反对 回复 2019-06-17
  • 3 回答
  • 0 关注
  • 3569 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信