Почему я получаю код ошибки 1452, не могу добавить или обновить дочернюю строку - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь добавить внешний ключ в таблицу с составным ключом. Мне удалось добавить внешний ключ для первого столбца, но не для второго.

Я искал stackoverflow, читая все подобные вопросы. Я искал в интернете. Я проверил родительские таблицы по дочерней таблице, и определения столбцов выглядят одинаково. Я проверил написание имен столбцов. Я использовал другой оператор alter, который работал для другого внешнего ключа. Я в растерянности.

Таблица: детали заказа

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 голосов
/ 27 апреля 2019

Я наконец понял, что случилось.в дочерней таблице было два значения, которых не было в родительской таблице.Я удалил эти записи, и моя ошибка ушла.

0 голосов
/ 24 апреля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...