Сбой ограничения внешнего ключа при добавлении внешнего ключа - PullRequest
0 голосов
/ 17 мая 2018

У меня есть две ранее существующие таблицы, bar (с 2 столбцами, id [int 11] и name) и foo_bar (с 3 столбцами, id, foo_id и bar_id [int 11]). (Есть также таблица foo, но здесь она не актуальна.)

Я хочу добавить миграцию к foo_bar, чтобы при удалении строки из bar удалялась соответствующая строка в foo_bar. Это мое утверждение:

ALTER TABLE `foo_bar` ADD FOREIGN KEY (`bar_id`) REFERENCES `bar`(`id`) ON DELETE CASCADE

Но когда я запускаю это, я получаю эту ошибку:

1452 - Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено (dbn. #sql-1_10ad, CONSTRAINT #sql-1_10ad_ibfk_1 FOREIGN KEY (bar_id) ССЫЛКИ bar (id) НА УДАЛИТЬ КАСКАД )

И bar_id, и id в таблице bar имеют тип int(11). id в таблице bar является первичным ключом.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Я думаю, проблема в том, что строки уже существуют, которые нарушают ограничение. Вы можете увидеть, так ли это, запустив:

select fb.*
from foo_bar fb
where not exists (select 1 from bar b where b.id = fb.id);

Если это так, то удалите ошибочные строки и попробуйте снова добавить ограничение.

0 голосов
/ 17 мая 2018

Я предполагаю, что существует внешний ключ bar_id, который ссылается на id в таблице bar, которая не существует.Вы можете найти его, используя этот запрос:

SELECT *
FROM foo_bar fb
LEFT JOIN bar b
    on fb.bar_id = b.id
WHERE b.id IS NULL;

Чтобы решить проблему, вы можете либо удалить эти проблемные записи из foo_bar, либо обновить их, чтобы они указывали на родительские строки в bar, которые на самом деле существуют.

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