我正在尝试将外键添加到具有复合键的表中。我能够为第一列添加外键,但不能为第二列添加外键。
我搜索了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。
答案 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)
我终于弄清楚出了什么问题。子表中有两个不在父表中的值。我删除了这些记录,错误消失了。