无法添加或更新子行:外键约束失败

时间:2014-05-02 12:00:19

标签: mysql

  

#1452 - 无法添加或更新子行:外键约束失败(robotspecifications,CONSTRAINT specifications_ibfk_1 FOREIGN KEY(Product_code)REFERENCES {{ 1}}(product shipment))

我是新手,我真的不知道我在这里出去了什么!? :oo

我几乎100%确定我在其他表中正确定义了我的主键和外键..

有人能用英语母语告诉我,这里我做错了什么?

1 个答案:

答案 0 :(得分:0)

对表中不存在的值的引用可能会导致此问题。在包含数据的表中设置外键约束时,我不止一次遇到过它。

此问题的解决方案是查找对不存在的行的引用并删除它们。完成此操作后,如果语法和表定义正确,则约束应该起作用。

Table : Country
cid  |    Name    |   Comment
---------------------------------
1    |    Japan   |   xyz
2    |    USA     |   pqr
3    |    India   |   abc
4    |    Germany |   lmn
30   |    France  |   pqr

Table : Language
lid  |  country_id | lang_name
---------------------------------
101  |      1      | Japanese
901  |      2      | Engligh
291  |      3      | Hindi
678  |      4      | German
283  |      30     | French
827  |      9      | Russian

我们可以看到语言#827引用了国家/地区#9,但我们的国家/地区表没有此值。没有[9 |俄罗斯| ghk]那里。

尝试创建外键约束将失败,并显示以下错误

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test_db`.`#sql-4ae_1f19e`, CONSTRAINT `country_ID_fk` FOREIGN KEY (`country_id`) REFERENCES `country` (`cid`))

解决方案:我们需要找到所有不存在的引用并手动删除它们。小桌子很简单。对于包含大量数据的表,使用以下查询来查找所有不存在的引用:

select country_id,(select count(*) from country where country_id = cid) from language WHERE country_id*(select count(*) from country where country_id = cid) = 0 ;

这将列出所有不存在的引用。删除引用后,可以使用以下命令创建约束:

ALTER TABLE language ADD CONSTRAINT country_if_fk FOREIGN KEY (country_id) REFERENCES country(`cid`);