Как переименовать индекс в 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;