Вопрос внешнего ключа MySQL - PullRequest
6 голосов
/ 18 июля 2010

Определение внешнего ключа также определяет индекс? У меня mysql v5.1.46, и я смотрю на инструмент администратора MySQL, и он показывает внешний ключ в качестве индекса, поэтому я хотел подтвердить?

Ответы [ 2 ]

8 голосов
/ 18 июля 2010
  • Если уже есть пригодный для использования индекс (индекс, в котором столбцы внешнего ключа перечислены как первые столбцы в том же порядке), то новый индекс не создается.
  • Если нетпригодный для использования индекс, затем создание внешнего ключа также создает индекс.

Это описано в документации .

InnoDB требует индексы для внешних ключей иссылочные ключи, так что проверка внешних ключей может быть быстрой и не требующей сканирования таблицы.В ссылочной таблице должен быть индекс, в котором столбцы внешнего ключа перечислены как первые столбцы в том же порядке.Такой индекс создается в ссылочной таблице автоматически, если он не существует.(Это отличается от некоторых более старых версий, в которых индексы должны были создаваться явно, или создание ограничений внешнего ключа не удавалось.) Index_name, если дано, используется, как описано ранее.

3 голосов
/ 18 июля 2010

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

Обратите внимание, что индекс создается автоматически только в ссылочной таблице, а не в ссылочной таблице.MySQL не позволит вам создать внешний ключ, который ссылается на поле в ссылочной таблице, которое не может использовать индекс:

CREATE TABLE orders (
  id int PRIMARY KEY,
  code int,
  name varchar(10)
) ENGINE=INNODB;

CREATE TABLE order_details (
  detail_id int PRIMARY KEY,
  order_code int,
  value int,
  FOREIGN KEY (order_code) REFERENCES orders(code)
) ENGINE=INNODB;

ERROR 1005 (HY000): Can't create table 'test.order_details'

Это не очень часто, так как вы часто создаете ограничения внешнего ключакоторые ссылаются на первичный ключ ссылочной таблицы, а первичные ключи индексируются автоматически.Однако, вероятно, стоит иметь в виду.

Создание индекса в поле code таблицы orders решит проблему:

CREATE INDEX ix_orders_code ON orders(code);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...