Як перейменувати індекс у MySQL


82

Я хотів би перейменувати індекс. Я переглянув документацію до таблиці змін , але не можу зрозуміти синтаксис, щоб просто перейменувати індекс. Роблячи це через графічний інтерфейс MySQL, він знижує індекс і створює новий. Хоча це працює, я хотів би уникати перебудови всього індексу, лише щоб змінити назву індексу.

[ДОДАТКОВА ІНФОРМАЦІЯ]

У документації до таблиці змін зазначено

Зміни, що змінюють лише метадані таблиці, а не дані таблиці, можна негайно внести, змінивши файл .frm таблиці та не торкаючись вмісту таблиці. Наступні зміни - це швидкі зміни, які можна зробити таким чином:

* Renaming a column or index.

Однак, коли я спробував перейменувати індекс, відредагувавши файл .frm (у тестовій базі даних) і перезапустивши сервер, тепер в інтерфейсі повідомляється "Не вдалося отримати стовпці" при спробі перерахування стовпців та при спробі запустити запит, він повертає помилку "Невідомий механізм таблиць ''". Файл .frm має багато двійкового вмісту. Чи є хороший інструмент для редагування двійкової інформації.

Відповіді:


144

Я відповів на це запитання в 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 (...).

У ALTER INDEXMySQL немає команди. Ви можете тільки DROP INDEXі тоді CREATE INDEXз новою назвою.


Щодо вашого оновлення вище: можливо, документація недостатньо точна. Незважаючи на це, не існує синтаксису SQL для перейменування індексу.

Індекс - це структура даних, яку можна відновити з даних (насправді рекомендується періодично перебудовувати індекси за допомогою OPTIMIZE TABLE). Це займає певний час, але це звичайна операція. Структури даних індексів є окремими від даних таблиці, тому додавання або скидання індексу не повинно торкатися даних таблиці, як сказано в документації.

Щодо .frmфайлу, MySQL не підтримує редагування .frmфайлу. Я б не зробив цього з будь-якої причини. Ви на 100% гарантовано пошкодите свій стіл і зробите його непридатним для використання.



22
Дрібниці: стандарт SQL взагалі нічого не говорить про індекси! Це суто питання реалізації постачальника, пов’язане з оптимізацією, тому весь синтаксис, пов’язаний з індексами, є запатентованим для всіх марок бази даних SQL.
Білл Карвін

1
Так, це майже те, що сталося. Навіть змусив MySQL збій при неправильному редагуванні файлу. Позначивши це як правильне. В ідеалі ви можете просто перейменувати індекс, оскільки це просто метадані, але, схоже, цього функціонально не існує.
Кібі

60

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


10
Будьте обережні, скидаючи та додаючи нові індекси, якщо це велика таблиця, це може зайняти багато часу. Чудовим способом зробити це на великому столі є використання pt-online-schema-change: percona.com/doc/percona-toolkit/2.1/…
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
Пугган,

Мабуть, слід зробити це власною відповіддю Puggan Se, оскільки це найефективніший / найбезпечніший спосіб для mysql до 5.7
xref

Збентежений, як на ФК впливатиме індекс. Ви не змінюєте дані, лише індекс даних.
gdbj

@gdbj Обмеження зовнішнього ключа залежать від індексу, тому я не думаю, що ви можете скинути індекс, який використовується обмеженням зовнішнього ключа.
Charles Wood
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.