Добавлено ограничение FK для удаления записи и не может добавить ее обратно после.MySQL - PullRequest
0 голосов
/ 07 февраля 2019

Мне нужно было удалить некоторые ограничения FK, чтобы удалить строку в таблице, но я хочу добавить ее обратно после удаления, но я получаю эту ошибку, когда пытаюсь добавить ее обратно в:

Невозможно добавить или обновить дочернюю строку: сбой ограничения внешнего ключа ...

Я знаю, эта ошибка возникает при попытке вставить соответствующий ключ, который не существует, но неясно, почему яполучить эту ошибку при попытке добавить ограничение обратно в таблицу?Это таблица сопоставления, так что, может быть, есть какая-то проблема с этим?

Вот исходная таблица:

CREATE TABLE `franchise_state` (
 `franchise_id` int(11) NOT NULL,
 `state_id` int(11) NOT NULL,
 PRIMARY KEY (`franchise_id`,`state_id`),
 KEY `fk_state_id_franchise_state` (`state_id`),
 CONSTRAINT `fk_franchise_id_franchise_state` FOREIGN KEY (`franchise_id`) REFERENCES `franchise` (`franchise_id`),
 CONSTRAINT `fk_state_id_franchise_state` FOREIGN KEY (`state_id`) REFERENCES `states` (`state_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Затем я запустил этот оператор таблицы изменения:

alter table franchise_state drop foreign key fk_franchise_id_franchise_state

Теперь таблица выглядит следующим образом:

CREATE TABLE `franchise_state` (
 `franchise_id` int(11) NOT NULL,
 `state_id` int(11) NOT NULL,
 PRIMARY KEY (`franchise_id`,`state_id`),
 KEY `fk_state_id_franchise_state` (`state_id`),
 CONSTRAINT `fk_state_id_franchise_state` FOREIGN KEY (`state_id`) REFERENCES `states` (`state_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Хорошо, в этот момент я удаляю строку в таблице франшизы (и удаляю все соответствующие строки franchise_id в franchise_state) и пытаюсь снова установить ограничение следующим образом:

ALTER TABLE franchise_state ADD CONSTRAINT fk_franchise_id_franchise_state FOREIGN KEY (franchise_id) REFERENCES franchise(franchise_id);

Но, как указано в начале, я получаю «Невозможно добавить или обновить дочернюю строку: чужую ...» ??

1 Ответ

0 голосов
/ 08 февраля 2019

Вот запрос, который поможет найти пропущенные строки в родительской таблице franchise:

select franchise_id 
from franchise_state 
left join franchise using(franchise_id) 
where franchise.franchise_id is null; 

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

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