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.id
是primary auto increment int(11)
company_id
是index int(11)
我不明白错误信息。任何人都可以对此有所了解吗?
答案 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之前说的那样。