2009-09-23 2 views
60

Я хотел бы переименовать индекс. Я просмотрел документацию alter table, но я не могу понять синтаксис, чтобы просто переименовать индекс. Выполняя это через GUI MySQL, он отбрасывает индекс и создает новый. Хотя это работает, я хотел бы избежать перестройки всего индекса только для изменения имени индекса.Как переименовать индекс в MySQL

[ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ]

В документации альтер таблице говорится

изменения, которые модифицируют только таблицу метаданных и не табличные данные могут быть сделаны сразу путем изменения файла .frm в таблицы и не трогающий таблица содержание. Следующие изменения являются быстрые изменения, которые могут быть сделаны таким образом:

* Renaming a column or index. 

Однако, когда я попытался переименовать индекс путем редактирования файла .frm (на тестовой базе данных) и перезапуска сервера, он теперь заявляет: «Не удалось получить столбцы» в пользовательском интерфейсе при попытке перечислить столбцы, а при попытке выполнить запрос возвращает ошибку «Неизвестный механизм таблицы». Файл .frm содержит много двоичного содержимого. Есть ли хороший инструмент для редактирования двоичной информации.

ответ

107

Я ответил на этот вопрос в 2009 году. В то время в MySQL не было синтаксиса для переименования индекса.

С этого момента MySQL 5.7 представил синтаксис ALTER TABLE RENAME INDEX.

http://dev.mysql.com/doc/refman/5.7/en/alter-table.html в частности, говорится:

  • RENAME INDEX old_index_name TO new_index_name переименовывает индекс. Это расширение MySQL для стандартного SQL. Содержимое таблицы остается неизменным. old_index_name должно быть именем существующего индекса в таблице, который не отбрасывается одним и тем же оператором ALTER TABLE. new_index_name - это новое имя индекса, которое не может дублировать имя индекса в результирующей таблице после того, как изменения были применены. Ни одно из имен индекса не может быть PRIMARY.

Более ранние версии MySQL, например. 5.6 и ранее, не поддерживайте синтаксис в ALTER TABLE, чтобы переименовать индекс (или ключ, который является синонимом).

Единственным решением было ALTER TABLE DROP KEY oldkeyname, ADD KEY newkeyname (...).

В MySQL нет команды ALTER INDEX. Вы можете только DROP INDEX, а затем CREATE INDEX с новым именем.


Об обновлении: Возможно, документация недостаточно точна. Несмотря на это, для переименования индекса нет синтаксиса SQL.

Индекс - это структура данных, которая может быть перестроена из данных (на самом деле рекомендуется периодически обновлять индексы с помощью OPTIMIZE TABLE). Это занимает некоторое время, но это обычная операция. Структуры данных индексов отделены от данных таблицы, поэтому добавление или отбрасывание индекса не должно касаться данных таблицы, как указано в документации.

Относительно файла .frm MySQL не поддерживает редактирование файла .frm. Я бы не поступил по этой причине. Вы на 100% гарантируете испортить свой стол и сделать его непригодным для использования.


+17

Общая информация: стандарт SQL ничего не говорит вообще об индексах! Это чисто проблема реализации поставщика, связанная с оптимизацией, поэтому все синтаксисы, связанные с индексами, являются собственностью всех брендов базы данных SQL. –

+1

Да, это в значительной степени то, что произошло. Даже при сбое MySQL при неправильном редактировании файла. Пометьте это как правильное. В идеале вы можете просто переименовать индекс, потому что это всего лишь метаданные, но похоже, что функционально не существует. – Kibbee

40

Для MySQL 5.7:

ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name 

Для MySQL более старые версии:

ALTER TABLE tbl_name DROP INDEX old_index_name, ADD INDEX new_index_name (...) 

См http://dev.mysql.com/doc/refman/5.7/en/alter-table.html

+5

Будьте осторожны, бросая и добавляя новые индексы, если это большая таблица, это может занять много времени. Отличный способ сделать это на большой таблице - использовать pt-online-schema-change: http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html – jbrahy

3

Этот вопрос был задан вопрос давным-давно, и последний раз обновлялась более половины год назад. Еще я чувствую необходимость добавить этот совет:

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

SET FOREIGN_KEY_CHECKS = 0; 
ALTER TABLE tbl DROP INDEX index_name; 
ALTER TABLE tbl ADD INDEX new_index_name (indexed_column); 
SET FOREIGN_KEY_CHECKS = 1; 

Надеюсь, что кто-то посчитает это полезным.

+5

Это швы плохо, не могли бы вы просто переключить порядок на падение и добавить? и держать проверки активными? 'ALTER TABLE tbl ADD INDEX new_index_name (indexed_column), DROP INDEX index_name' –

+0

Возможно, это сделает собственный ответ Puggan Se, так как это самый эффективный/безопасный способ для mysql до 5.7 – xref

-1

Для Oracle 11g (по крайней мере) это выглядит так:

ALTER INDEX upper_ix RENAME TO upper_name_ix; 
Смежные вопросы