WiDeIvan
@WiDeIvan
Веб-разработчик

Зачем удалять foreign key для того, чтобы удалить уникальный индекс?

Пытаюсь разобраться в вопросе, но нахожу только решения вопроса, а не объяснение почему так.

Имеется 2 таблицы:

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

CREATE TABLE `items` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `number` int(10) unsigned NOT NULL,
  `title` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_id_number_unique` (`user_id`,`number`),
  CONSTRAINT `items_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;


Она заполняется данными, всё хорошо.
Вдруг я осознал, что мне не нужна колонка number в таблице items.
Чтобы её удалить, я сначала должен удалить свой составной уникальный индекс.
Но почему-то MySQL не даёт мне это сделать просто так, без танцев с бубном.

Ввожу запрос:

DROP INDEX user_id_number_unique ON items;

На что получаю ошибку Cannot drop index 'user_id_number_unique': needed in a foreign key constraint.
И мне приходится сначала удалять внешний ключ (который у меня items_ibfk_1 из примера выше), удалять индекс user_id_number_unique, удалять поле number и снова возвращать внешний ключ.

Я не могу понять, чем мешает внешний ключ?
  • Вопрос задан
  • 122 просмотра
Решения вопроса 1
Для внешнего ключа обязательно наличие индекса, иначе его не создать. Если индекса нет, при создании внешнего ключа он создаётся автоматически, поэтому может казаться, что связи между ними нет.

MySQL requires indexes on foreign keys and referenced keys so that foreign key checks can be fast and not require a table scan. In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order. Such an index is created on the referencing table automatically if it does not exist. This index might be silently dropped later, if you create another index that can be used to enforce the foreign key constraint. index_name, if given, is used as described previously.
https://dev.mysql.com/doc/refman/5.7/en/create-tab...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
Badoo Development Москва
от 140 000 до 180 000 руб.
SaveTime Москва
от 140 000 до 200 000 руб.
Badoo Development Москва
от 180 000 до 250 000 руб.
22 окт. 2018, в 02:30
12000 руб./за проект
22 окт. 2018, в 02:01
10000 руб./за проект
21 окт. 2018, в 22:38
1200 руб./за проект