Вопрос о внешнем ключе MySQL

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

6
задан Daniel Vassallo 20 July 2010 в 12:28
поделиться

2 ответа

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

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

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

8
ответ дан 9 December 2019 в 22:28
поделиться

Да, 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'

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

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

CREATE INDEX ix_orders_code ON orders(code);
3
ответ дан 9 December 2019 в 22:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: