首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Mysql错误1452 -无法添加或更新子行:外键约束失败

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

Stack Overflow用户
提问于 2009-08-10 06:54:19
回答 15查看 496.1K关注 0票数 243

我有点奇怪的问题。我正尝试将一个外键添加到一个引用另一个表的表中,但由于某种原因,它失败了。由于我对MySQL的了解有限,唯一可能令人怀疑的是,在另一个表上有一个外键引用了我试图引用的那个外键。

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

代码语言:javascript
复制
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

以下是生成错误的代码:

代码语言:javascript
复制
ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE
EN

回答 15

Stack Overflow用户

发布于 2009-08-10 07:38:52

您的sourcecodes_tags表很可能包含不再存在于sourcecodes表中的sourcecode_id值。你必须先摆脱它们。

下面是一个可以找到这些ID的查询:

代码语言:javascript
复制
SELECT DISTINCT sourcecode_id FROM 
   sourcecodes_tags tags LEFT JOIN sourcecodes sc ON tags.sourcecode_id=sc.id 
WHERE sc.id IS NULL;
票数 229
EN

Stack Overflow用户

发布于 2012-02-04 15:29:55

我的MySQL数据库也有同样的问题,但最终,我得到了一个对我有效的解决方案。

因为在我的表中,从mysql的角度来看一切都很好(两个表都应该使用InnoDB引擎,并且每列的数据类型都应该是相同的类型,这是外键约束的一部分)。

我所做的唯一一件事就是禁用外键检查,然后在执行外键操作后启用它。

我采取的步骤:

代码语言:javascript
复制
SET foreign_key_checks = 0;
代码语言:javascript
复制
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
代码语言:javascript
复制
SET foreign_key_checks = 1;
票数 104
EN

Stack Overflow用户

发布于 2013-03-30 02:32:55

对我来说,这个问题有点不同,非常容易检查和解决。

您必须确保两个表都是InnoDB。如果其中一个表(即引用表)是MyISAM,则约束将失败。

代码语言:javascript
复制
    SHOW TABLE STATUS WHERE Name =  't1';

    ALTER TABLE t1 ENGINE=InnoDB;
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1253459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档