猿问

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

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

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

心有法竹
浏览 3570回答 3
3回答

茅侃侃

我的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: 0SET foreign_key_checks = 1;

宝慕林4294392

使用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)编辑:IN和NOT IN运算符比JOIN运算符,以及更容易构建和重复的操作。
随时随地看视频慕课网APP
我要回答