CREATE INDEX vs ALTER TABLE ADD INDEX - MySQLism или стандарт SQL?

28

Просто натолкнулся на странную проблему, когда в зависимости от того, как я создаю индекс, требуется имя индекса.

http://dev.mysql.com/doc/refman/5.5/en/create-index.html

http://dev.mysql.com/doc/refman/5.5/en/alter-table.html

CREATE INDEX `random_name` ON `my_table` (`my_column`); # Requires an index name

ALTER TABLE `my_table` ADD INDEX (`my_column`); # Does not require an index name

Мне кажется, что вызов CREATE INDEX не должен делать имя индекса обязательным. Мне интересно, если это MySQLism или стандарт SQL?

Майк Перселл
источник

Ответы:

25

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

Цитата из этой страницы Википедии :

Стандартизация

Не существует стандарта для создания индексов, поскольку стандарт ISO SQL не охватывает физические аспекты. Индексы являются одной из физических частей концепции базы данных среди других, таких как хранилище (табличное пространство или файловые группы). Все поставщики СУБД предоставляют синтаксис CREATE INDEX с некоторыми конкретными параметрами, которые зависят от функций, которые они предоставляют клиентам.

Руководство Postgres, кажется, поддерживает это здесь:

В стандарте SQL нет положений для индексов.

Больше доказательств по этому связанному вопросу о SO.

Эрвин Брандштеттер
источник
6
MySQL - единственная из известных мне СУБД, которая позволяет добавлять явный индекс, используя ALTER TABLE(в некоторых случаях неявные индексы будут создаваться различными СУБД для поддержки ограничений, но я не это имею в виду).
a_horse_with_no_name
@a_horse_with_no_name: должным образом отмечено. Я не понимаю, почему MySQL заставляет нас передавать index_name, когда он явно не может обработать имя под ним. Это PITA, которую нужно изменить, просто чтобы избежать именования индексов.
Майк Перселл,
-1

Если вы не предоставите имя для индекса, MySQL автоматически назовет индекс для вас.

ALTER TABLE my_table ADD INDEX (col1);
ALTER TABLE my_table ADD INDEX (col1, col2);
ALTER TABLE my_table ADD INDEX (col2);

SHOW INDEX FROM my_table;

Приведенные ALTER TABLE ADD INDEXвыше заявления приведут к следующим индексам:

  • col1
  • col1_2
  • col2

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

Хорошей практикой является предоставление имени для индекса (и добавление к нему префикса idxили чего-то еще, чтобы идентифицировать его как индекс):

ALTER TABLE my_table ADD INDEX idx_my_column (my_column);

-- or
CREATE INDEX idx_my_column ON my_table (my_column);
kimbaudi
источник