2009-09-23 16 views
60

Chciałbym zmienić nazwę indeksu. Przyjrzałem się dokumentacji alter table, ale nie mogę znaleźć składni po prostu zmienić nazwę indeksu. Robiąc to za pośrednictwem GUI MySQL, upuszcza indeks i tworzy nowy. Chociaż to działa, chciałbym uniknąć odbudowania całego indeksu tylko po to, aby zmienić nazwę indeksu.Jak zmienić nazwę indeksu w MySQL

[DODATKOWE INFO]

W alter dokumentacji tabeli stwierdza

przeróbek, które modyfikują tylko tabelę metadanych i nie dane tabeli może być wykonana natychmiast zmieniając plik .frm w stołu i nie dotykając zawartości tabeli . Następujące zmiany są szybkie zmiany, które mogą być wykonane ten sposób:

* Renaming a column or index. 

Jednak gdy próbowałem zmienić nazwę indeksu poprzez edycję pliku .frm (na bazie testu) i ponownym uruchomieniu serwera, teraz stwierdza "Nie można pobrać kolumn" w interfejsie podczas próby wyświetlenia kolumn, a podczas próby uruchomienia zapytania zwraca błąd "Nieznany silnik tabeli" "". Plik .frm zawiera dużo treści binarnych. Czy istnieje dobre narzędzie do edycji informacji binarnych.

Odpowiedz

107

Odpowiedziałem na to pytanie w 2009 roku. W tym czasie nie było składni w MySQL, aby zmienić nazwę indeksu.

Od tego czasu MySQL 5.7 wprowadził składnię ALTER TABLE RENAME INDEX.

http://dev.mysql.com/doc/refman/5.7/en/alter-table.html mówi w części:

  • RENAME INDEX old_index_name TO new_index_name zmienia nazwę indeksu. Jest to rozszerzenie MySQL do standardowego SQL. Treść tabeli pozostaje niezmieniona. old_index_name musi być nazwą istniejącego indeksu w tabeli, który nie został usunięty przez tę samą instrukcję ALTER TABLE. new_index_name to nowa nazwa indeksu, która nie może duplikować nazwy indeksu w wynikowej tabeli po zastosowaniu zmian. Żadna nazwa indeksu nie może być PRIMARY.

Wcześniejsze wersje MySQL, np. 5.6 i wcześniejsze, nie obsługują składni w ALTER TABLE, aby zmienić nazwę indeksu (lub klucza, który jest synonimem).

Jedynym rozwiązaniem było ALTER TABLE DROP KEY oldkeyname, ADD KEY newkeyname (...).

W MySQL nie ma polecenia ALTER INDEX. Możesz tylko DROP INDEX, a następnie CREATE INDEX z nową nazwą.


Jeśli chodzi o powyższą aktualizację: być może dokumentacja nie jest wystarczająco precyzyjna. Bez względu na to, nie ma żadnej składni SQL, która mogłaby zmienić nazwę indeksu.

Indeks jest strukturą danych, którą można odbudować z danych (w rzeczywistości zaleca się okresową odbudowę indeksów przy pomocy OPTIMIZE TABLE). Zajmuje to trochę czasu, ale jest to zwykła operacja. Struktury danych indeksów są oddzielone od danych tabeli, więc dodawanie lub upuszczanie indeksu nie musi dotykać danych tabeli, jak mówi dokumentacja.

Jeśli chodzi o plik .frm, MySQL nie obsługuje edycji pliku .frm. Nie zrobiłbym tego z żadnego powodu. Masz 100% gwarancji, że uszkodzisz swój stół i sprawisz, że będzie bezużyteczny.


+17

Ciekawostki: średnia SQL w ogóle nic nie mówi o indeksach! Jest to wyłącznie problem implementacji dostawcy związany z optymalizacją, więc cała składnia związana z indeksami jest zastrzeżona we wszystkich markach baz danych SQL. –

+1

Tak, właśnie to się stało. Nawet spowodował awarię MySQL podczas niepoprawnej edycji pliku. Oznaczenie to jako prawidłowe. Najlepiej byłoby po prostu zmienić nazwę indeksu, ponieważ jest to po prostu metadane, ale wygląda na to, że funkcjonalnie nie istnieje. – Kibbee

40

dla MySQL 5.7:

ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name 

MySQL starsze wersje:

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

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

+5

Ostrożnie upuszczając i dodając nowe indeksy, jeśli jest to duży stół, może to zająć dużo czasu. Świetnym sposobem na zrobienie tego na dużym stole jest użycie pt-online-schema-change: http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html – jbrahy

3

To pytanie było zadawane wieki temu, a ostatnio aktualizowany ponad pół rok temu. Nadal czuję potrzebę dodania tej wskazówki:

Jeśli kolumna indeksowana jest używana gdzie indziej jako klucz obcy, może wystąpić błąd związany z tym. Może to pomóc:

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; 

Mam nadzieję, że ktoś uzna to za przydatne.

+5

szwy złe, czy nie mógłbyś po prostu zmienić zamówienia przy spadku i dodać? i czy kontrole są aktywne? 'ALTER TABLE tbl ADD INDEX new_index_name (indexed_column), DROP INDEX index_name' –

+0

Prawdopodobnie powinien to uczynić własną odpowiedzią Puggan Se, ponieważ jest to najbardziej efektywny/najbezpieczniejszy sposób dla mysql przed 5.7 – xref

-1

Dla Oracle 11g (co najmniej) to jest tak:

ALTER INDEX upper_ix RENAME TO upper_name_ix;