Как переименовать индекс в MySQL

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

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

В документации к альтернативной таблице указано

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

* Renaming a column or index.

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

Ответ 1

Я ответил на этот вопрос в 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% гарантируете испортить свой стол и сделать его непригодным.


Ответ 2

Для 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

Ответ 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;

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

Ответ 4

Для Oracle 11g (по крайней мере):

ALTER INDEX upper_ix RENAME TO upper_name_ix;