mysql外键错误#1452

时间:2011-03-04 19:58:28

标签: mysql

ALTER TABLE  `groups` ADD FOREIGN KEY (  `company_id` ) REFERENCES  `summaries`.`companies` (

`id`
) ON DELETE CASCADE ;

MySQL said: 

#1452 - Cannot add or update a child row: a foreign key constraint fails (`summaries/#sql-164a_33c`, CONSTRAINT `#sql-164a_33c_ibfk_1` FOREIGN KEY (`company_id`) REFERENCES `companies` (`id`) ON DELETE CASCADE) 

companies.idprimary auto increment int(11)

company_idindex int(11)

我不明白错误信息。任何人都可以对此有所了解吗?

4 个答案:

答案 0 :(得分:28)

这意味着子表中至少有一行引用父表中不存在的行。

如果您完全确定可以解决此类数据完整性问题,则可以在运行ALTER TABLE命令之前通过禁用外键检查来添加外键:

SET FOREIGN_KEY_CHECKS = 0;

答案 1 :(得分:5)

我遇到了这个问题,尽管在一个更具体的情况下。

就我而言,我已经在现有表中添加了一个我需要可以为空的列并充当外键(即,非空条目受外键约束限制)。 / p>

引用的列如下所示:

+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| id          | int(10)     | NO   | PRI | NULL    | auto_increment |
+-------------+-------------+------+-----+---------+----------------+

和引用这样的:

+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| bed_id      | int(10)     | YES  |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+

原来我忘记在将引用列添加到现有表时指定DEFAULT NULL,因此它会自动填充零,这会使外键约束失败。

我将它们改为NULL:

update devices set bed_id = NULL where bed_id = 0;

然后成功添加了外键约束。希望这有助于某人

答案 2 :(得分:1)

看起来它试图将groups表复制到摘要数据库中的临时表。

MySQL试图首先将请求的约束放在临时表上。组表中可能还有一行或多行(因此也是临时表),其summary_id不再出现在summaries.companies表中。

要验证:尝试在组和摘要之间运行LEFT JOIN。公司WHERE companies.id为NULL。如果从LEFT JOIN返回任何行,则会在groups表中找到错误的行。

试一试!!!

答案 3 :(得分:0)

检查"公司" table不为空,如果为空并且您当时没有数据。

 set SET FOREIGN_KEY_CHECKS = 0; 
像Ike之前说的那样。