#mysql #foreign-keys
#mysql #внешние ключи
Вопрос:
У меня есть две таблицы с внешними ключами, но при удалении записи из ‘fb_campaign’ появляется следующая ошибка:
#1451 — Не удается удалить или обновить родительскую строку: сбой mydb
fb_campaign_cat
ограничения fb_campaign_cat_ibfk_1
внешнего ключа (., ССЫЛКИ НА ВНЕШНИЙ КЛЮЧ ОГРАНИЧЕНИЯ id
fb_campaign
() ( id_cat
)))
Проблема возникает, когда я добавляю второй внешний ключ.
table1: fb_campaign_cat
---- -----------
| id | fb_cat |
---- -----------
| 1 | category1 |
| 2 | category2 |
| 3 | category3 |
---- -----------
table2: fb_campaign
------- -------- -----------
| id_fb | id_cat | name |
------- -------- -----------
| 1 | 1 | campaign1 |
| 2 | 2 | campaign2 |
------- -------- -----------
** схема **
CREATE TABLE `fb_campaign_cat` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`fb_cat` varchar(30) CHARACTER SET utf8mb4 NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `fb_campaign` (
`id_fb` int(11) NOT NULL AUTO_INCREMENT,
`id_cat` int(11) NOT NULL,
`name` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ВНЕШНИЙ КЛЮЧ
ALTER TABLE fb_campaign
ADD CONSTRAINT fb_campaign_cat
FOREIGN KEY (id_cat)
REFERENCES fb_campaign_cat(id)
ON DELETE CASCADE;
ALTER TABLE fb_campaign_cat
ADD FOREIGN KEY (id) REFERENCES fb_campaign(id_cat);
Комментарии:
1. Предоставьте полный
SHOW CREATE TABLe tablename;
вывод для обеих таблиц.2. Добавлено в мой вопрос. Спасибо
3. Нет индекса для создания FK. dbfiddle.uk /…
4. @Akina Работает нормально при удалении записей из ‘fb_campaign’, но при добавлении новой категории в ‘fb_campaign_cat’ без какой-либо связанной записи в ‘fb_campaign’ появляется эта ошибка # 1452 — Не удается добавить или обновить дочернюю строку: сбой ограничения внешнего ключа (
mydb
.fb_campaign_cat
, ОГРАНИЧЕНИЕfb_campaign_cat_ibfk_1
ССЫЛОК НА ВНЕШНИЙ КЛЮЧ (id
)fb_campaign
(id_cat
))5. Ваши новые DDL несовместимы — MySQL выдаст ошибку (например, «должен быть только один автоматически созданный столбец, и он должен быть первичным ключом»). dbfiddle.uk /…
Ответ №1:
Простым способом было бы отключить проверку внешнего ключа; внесите изменения, а затем снова включите проверку внешнего ключа.
SET FOREIGN_KEY_CHECKS=0; -- to disable them
SET FOREIGN_KEY_CHECKS=1; -- to re-enable them