Ответы:
Да, но только на InnoDB, В настоящее время Innodb является единственным форматом таблицы, в котором реализованы внешние ключи.
Очевидно, индекс создается автоматически, как указано в ссылке, которую опубликовал Роберт .
InnoDB требует индексов для внешних ключей и ссылочных ключей, чтобы проверка внешних ключей могла быть быстрой и не требовала сканирования таблицы. В ссылочной таблице должен быть индекс, в котором столбцы внешнего ключа перечислены как первые столбцы в том же порядке. Такой индекс создается в ссылочной таблице автоматически, если он не существует. (Это отличается от некоторых более старых версий, в которых индексы должны были создаваться явно, иначе создание ограничений внешнего ключа завершилось бы неудачей.) Index_name, если дано, используется, как описано ранее.
InnoDB permits a foreign key to reference any index column or group of columns. However, in the referenced table, there must be an index where the referenced columns are the first columns in the same order.
Да, см. Ограничения InnoDB и FOREIGN KEY .
Вы не получите индекс автоматически, если вы выполните ALTER TABLE (вместо CREATE TABLE), по крайней мере, в соответствии с документацией (ссылка для 5.1, но то же самое для 5.5):
[...] Когда вы добавляете ограничение внешнего ключа в таблицу с помощью ALTER TABLE, не забудьте сначала создать необходимые индексы.
Для тех, кто ищет цитаты из 5.7
документов :
MySQL требует индексов для внешних ключей и ссылочных ключей, чтобы проверка внешних ключей могла быть быстрой и не требовала сканирования таблицы. В ссылочной таблице должен быть индекс, в котором столбцы внешнего ключа перечислены как первые столбцы в том же порядке. Такой индекс создается в ссылочной таблице автоматически, если он не существует. Этот индекс может быть автоматически удален позже, если вы создадите другой индекс, который можно будет использовать для применения ограничения внешнего ключа. index_name, если дано, используется, как описано ранее.
Как указано, это относится к InnoDB. Сначала мне показалось странным, что многие другие (в частности, MS SQL и DB2) этого не делают. Сканирование табличного пространства лучше, чем сканирование по индексу, когда строк таблицы очень мало - поэтому в подавляющем большинстве случаев внешний ключ может быть проиндексирован. Тогда это как бы меня поразило - это не обязательно означает, что это должен быть отдельный (один столбец) индекс - там, где он находится в автоматическом FK-индексе MySQL. Возможно, именно поэтому MS SQL, DB2 (в Oracle я не уверен) и т. Д. Оставляют это на усмотрение администратора баз данных; В конце концов, множественные индексы в больших таблицах могут вызвать проблемы с производительностью и пространством.
Да, Innodb
предоставьте это. Вы можете поместить имя внешнего ключа после FOREIGN KEY
предложения или оставить его, чтобы MySQL мог создать имя для вас. MySQL автоматически создает индекс с foreign_key_name
именем.
CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action
Невозможно получить ключ индекса автоматически использовать
ALTER TABLE (NAME OF THE TABLE) ADD INDEX (FOREIGN KEY)
Имя таблицы, которую вы создали, например, фотографии и КЛЮЧЕВОЙ КЛЮЧ, например photograph_id
. Код должен быть таким
ALTER TABLE photographs ADD INDEX (photograph_id);