MYSQL создает индекс автоматически, когда - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть следующая основная таблица:

CREATE TABLE IF NOT EXISTS `table_1` (
  `id` BIGINT UNSIGNED NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

И следующая таблица:

CREATE TABLE IF NOT EXISTS `table_2` (
  `id_1` BIGINT UNSIGNED NOT NULL,
  `id_2` BIGINT UNSIGNED NOT NULL,
  PRIMARY KEY (`id_1`,`id_2`),
  FOREIGN KEY (`id_1`) REFERENCES table_1(`id`) ON DELETE CASCADE,
  FOREIGN KEY (`id_2`) REFERENCES table_2(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

По какой-то причине при создании вышеуказанных таблиц я получаю следующий индекс, автоматически созданный MYSQL:

    Keyname Type    Unique  Packed  Column  Cardinality Collation Null  
      id_2  BTREE     No       No   id_2    94695       A      No   

Таким образом, MYSQL создает индекс для второго столбца с именем id_2 в table_2. Как ни странно, он не создается на обоих внешних ключах, и если я создам только 1 внешний ключ, MYSQL не создаст такой индекс.

Я попытался удалить индекс и получил следующую ошибку:

 Cannot drop index 'id_2': needed in a foreign key constraint

Так зачем MYSQL создавать такой индекс и почему он создается на обоих ключах ??

1 Ответ

0 голосов
/ 29 апреля 2018

В отличие от других баз данных, MySQL создает индексы для ограничений внешнего ключа. Как объяснено в документации :

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

В вашем случае одно из объявлений внешнего ключа обрабатывается индексом первичного ключа, поскольку id_1 является первым ключом в обоих из них.

...