Обычно это происходит, когда одна из строк уже существует в дочерней таблице 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
должен работать правильно.