Добавить внешний ключ в существующую таблицу (ошибка 1451)

#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