MySQL - создать два индекса, в выводе SHOW CREATE TABLE появляется только один - PullRequest
2 голосов
/ 25 ноября 2008

У меня есть таблица связывания «многие ко многим», и я пытаюсь установить на нее два внешних ключа. Я запускаю эти два утверждения:

ALTER TABLE address_list_memberships
ADD CONSTRAINT fk_address_list_memberships_address_id
FOREIGN KEY index_address_id (address_id)
REFERENCES addresses (id);

ALTER TABLE address_list_memberships
ADD CONSTRAINT fk_address_list_memberships_list_id
FOREIGN KEY index_list_id (list_id)
REFERENCES lists (id);

Я ожидал бы, что когда я запущу SHOW CREATE TABLE address_list_memberships, я увижу это:

[...]
KEY `index_address_id` (`address_id`),
KEY `index_list_id` (`list_id`),
CONSTRAINT `fk_address_list_memberships_list_id` FOREIGN KEY (`list_id`) 
    REFERENCES `lists` (`id`),
CONSTRAINT `fk_address_list_memberships_address_id` FOREIGN KEY (`address_id`) 
    REFERENCES `addresses` (`id`)

Но вместо этого я получаю это:

[...]
KEY `index_list_id` (`list_id`),
CONSTRAINT `fk_address_list_memberships_list_id` FOREIGN KEY (`list_id`) 
    REFERENCES `lists` (`id`),
CONSTRAINT `fk_address_list_memberships_address_id` FOREIGN KEY (`address_id`) 
    REFERENCES `addresses` (`id`)

Похоже, там только один индекс. Кажется, что это противоречит MySQL документам , в которых говорится, что MySQL автоматически создает индекс в столбце ссылок при создании внешнего ключа.

Я заметил эту вещь, состоящую только из одного индекса, каждый раз, когда я создаю два FK для таблицы, использую ли я инструмент GUI, такой как CocoaMySQL или SQLyog, или делаю это в командной строке.

Любое освещение этой тайны будет очень цениться.

Ответы [ 2 ]

2 голосов
/ 25 ноября 2008

Я только что попробовал, и он прекрасно работает для меня. Я скопировал и вставил ALTER заявления, которые вы написали, и вот что я получаю:

mysql> show create table address_list_memberships;

CREATE TABLE `address_list_memberships` (
  `address_id` bigint(20) unsigned NOT NULL,
  `list_id` bigint(20) unsigned NOT NULL,
  KEY `index_address_id` (`address_id`),
  KEY `index_list_id` (`list_id`),
  CONSTRAINT `fk_address_list_memberships_list_id` 
    FOREIGN KEY (`list_id`) REFERENCES `lists` (`id`),
  CONSTRAINT `fk_address_list_memberships_address_id` 
    FOREIGN KEY (`address_id`) REFERENCES `addresses` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Я использую MySQL 5.0.51a в Mac OS X.

edit: Попробуйте следующий запрос, чтобы получить все индексы, которые MySQL считает существующими в вашей таблице:

SELECT * FROM information_schema.key_column_usage 
WHERE table_schema = 'test' AND table_name = 'address_list_memberships'\G

(Я использовал базу данных 'test' для моего теста; вам следует заменить эту строку именем схемы, в которой определена ваша таблица.)

0 голосов
/ 12 июля 2009

Это не имеет значения. У вас все еще есть индекс на list_id. MySQL требует, чтобы любое ограничение внешнего ключа также имело индекс по ссылочным полям. Поскольку и index_list_id, и fk_address_list_memberships_list_id основаны на list_id, MySQL, вероятно, видит это и использует index_list_id в качестве индекса, переименовывая его в fk_address_list_memberships_list_id. Вы можете даже пропустить объявление индекса, поскольку MySQL будет делать это неявно в используемой вами версии.

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