为什么我收到错误代码1452不能添加或更新子行

时间:2019-04-24 02:06:21

标签: mysql foreign-keys

我正在尝试将外键添加到具有复合键的表中。我能够为第一列添加外键,但不能为第二列添加外键。

我搜索了stackoverflow,阅读了所有类似的问题。我搜索了互联网。我已经对照子表检查了父表,并且列定义似乎相同。我检查了列名的拼写。我使用了另一个对另一个外键起作用的alter语句。我很茫然。

表:orderdetails

Columns:
OrderID int(11) PK 
ProductID int(11) PK

表:产品

Columns:
productid int(11) AI PK
ALTER TABLE orderdetails
     ADD CONSTRAINT fk_od_prodid
     FOREIGN KEY (ProductID) REFERENCES products(productid);

我希望创建外键,但错误代码为1452。

2 个答案:

答案 0 :(得分:0)

当子表orderdetails中已经存在一行,而父表products中也没有行时,通常会发生这种情况。

您可以忽略该错误,并通过使用

暂时将其强制执行
SET FOREIGN_KEY_CHECKS=0;
ALTER TABLE orderdetails
     ADD CONSTRAINT fk_od_prodid
     FOREIGN KEY (ProductID) REFERENCES products(productid);
SET FOREIGN_KEY_CHECKS=1; 

或者查找有问题的记录使用

SELECT o.* 
FROM orderdetails AS o 
LEFT JOIN products AS p 
ON p.productid = o.ProductID 
WHERE p.productid IS NULL;

并删除有问题的记录
(仅影响orderdetails表,而未修改products。)

DELETE o
FROM orderdetails AS o
LEFT JOIN products AS p
ON p.productid = o.ProductID
WHERE p.productid IS NULL;

在删除有问题的记录之后,您的ALTER语句应该可以正常工作。

答案 1 :(得分:0)

我终于弄清楚出了什么问题。子表中有两个不在父表中的值。我删除了这些记录,错误消失了。