Wie benenne ich einen Index in MySQL um?

80

Ich möchte einen Index umbenennen. Ich habe mir die Dokumentation zur Änderungstabelle angesehen , kann aber die Syntax zum einfachen Umbenennen eines Index nicht herausfinden. Wenn Sie dies über die MySQL-Benutzeroberfläche tun, wird der Index gelöscht und ein neuer erstellt. Während dies funktioniert, möchte ich vermeiden, den gesamten Index neu zu erstellen, nur um den Namen eines Index zu ändern.

[ZUSÄTZLICHE INFORMATION]

In der Dokumentation zur Änderungstabelle wird angegeben

Änderungen, die nur Tabellenmetadaten und keine Tabellendaten ändern, können sofort vorgenommen werden, indem die .frm-Datei der Tabelle geändert wird und der Tabelleninhalt nicht berührt wird. Die folgenden Änderungen sind schnelle Änderungen, die auf diese Weise vorgenommen werden können:

* Renaming a column or index.

Als ich jedoch versuchte, den Index durch Bearbeiten der .frm-Datei (in einer Testdatenbank) und Neustarten des Servers umzubenennen, wurde in der Benutzeroberfläche beim Versuch, die Spalten aufzulisten, und beim Versuch, sie auszuführen, die Meldung "Spalten konnten nicht abgerufen werden" angezeigt Bei einer Abfrage wird der Fehler "Unknown table engine ''" zurückgegeben. Die .frm-Datei enthält viele binäre Inhalte. Gibt es ein gutes Werkzeug zum Bearbeiten der binären Informationen?

Kibbee
quelle

Antworten:

142

Ich habe diese Frage 2009 beantwortet. Zu diesem Zeitpunkt gab es in MySQL keine Syntax zum Umbenennen eines Index.

Seitdem hat MySQL 5.7 eine ALTER TABLE RENAME INDEXSyntax eingeführt.

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

  • RENAME INDEX old_index_name TO new_index_namebenennt einen Index um. Dies ist eine MySQL-Erweiterung für Standard-SQL. Der Inhalt der Tabelle bleibt unverändert. old_index_namemuss der Name eines vorhandenen Index in der Tabelle sein, der nicht von derselben ALTER TABLEAnweisung gelöscht wird . new_index_nameist der neue Indexname, der den Namen eines Index in der resultierenden Tabelle nicht duplizieren kann, nachdem Änderungen angewendet wurden. Keiner der Indexnamen kann sein PRIMARY.

Frühere Versionen von MySQL, z. B. 5.6 und früher, unterstützen keine Syntax ALTER TABLEzum Umbenennen eines Index (oder eines Schlüssels, der ein Synonym ist).

Die einzige Lösung war zu ALTER TABLE DROP KEY oldkeyname, ADD KEY newkeyname (...).

ALTER INDEXIn MySQL gibt es keinen Befehl. Sie können nur DROP INDEXund dann CREATE INDEXmit dem neuen Namen.


Zu Ihrem obigen Update: Möglicherweise ist die Dokumentation nicht präzise genug. Unabhängig davon gibt es keine SQL-Syntax zum Umbenennen eines Index.

Ein Index ist eine Datenstruktur, die aus den Daten neu erstellt werden kann (es wird empfohlen, Indizes regelmäßig mit neu zu erstellen OPTIMIZE TABLE). Es dauert einige Zeit, aber es ist eine alltägliche Operation. Indexdatenstrukturen sind von Tabellendaten getrennt, sodass das Hinzufügen oder Löschen eines Index die Tabellendaten nicht berühren muss, wie in der Dokumentation angegeben.

In Bezug auf die .frmDatei unterstützt MySQL das Bearbeiten der .frmDatei nicht. Ich würde es aus keinem Grund tun. Es ist 100% ig garantiert, dass Ihre Tabelle beschädigt und unbrauchbar wird.


Bill Karwin
quelle
22
Wissenswertes: Der SQL-Standard sagt überhaupt nichts über Indizes aus! Es handelt sich lediglich um ein Problem bei der Implementierung von Anbietern im Zusammenhang mit der Optimierung. Daher ist die gesamte Syntax für Indizes in allen Marken von SQL-Datenbanken proprietär.
Bill Karwin
1
Ja, genau das ist passiert. Sogar MySQL stürzte ab, wenn die Datei falsch bearbeitet wurde. Markieren Sie dies als richtig. Idealerweise können Sie den Index einfach umbenennen, da es sich nur um Metadaten handelt, aber es sieht so aus, als ob dies funktional nicht vorhanden ist.
Kibbee
57

Für MySQL 5.7:

ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name

Für ältere MySQL-Versionen:

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

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

joelparkerhenderson
quelle
10
Seien Sie vorsichtig beim Löschen und Hinzufügen neuer Indizes. Wenn es sich um eine große Tabelle handelt, kann dies lange dauern. Eine gute Möglichkeit, dies an einem großen Tisch zu tun, ist die Verwendung von pt-online-schema-change: percona.com/doc/percona-toolkit/2.1/…
jbrahy
3

Diese Frage wurde vor langer Zeit gestellt und zuletzt vor über einem halben Jahr aktualisiert. Trotzdem habe ich das Bedürfnis, diesen Tipp hinzuzufügen:

Wenn die indizierte Spalte an anderer Stelle als Fremdschlüssel verwendet wird, kann ein Fehler auftreten. Dies kann helfen:

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;

Hoffe, jemand findet das nützlich.

Ifedi Okonkwo
quelle
5
Das ist schlecht, könnten Sie nicht einfach die Reihenfolge beim Ablegen und Hinzufügen ändern? und Schecks aktiv halten? ALTER TABLE tbl ADD INDEX new_index_name (indexed_column), DROP INDEX index_name
Puggan Se
Sollte dies wahrscheinlich seine eigene Antwort sein, Puggan Se, da es der effizienteste / sicherste Weg für MySQL vor 5.7
XRef
Verwirrt, wie FKs von einem Index beeinflusst würden. Sie ändern nicht die Daten, sondern nur den Index der Daten.
GDBJ
@gdbj Fremdschlüsseleinschränkungen hängen von einem Index ab, daher glaube ich nicht, dass Sie einen Index löschen können, der von einer Fremdschlüsseleinschränkung verwendet wird.
Charles Wood
-2

Für Oracle 11g ist es (zumindest) so:

ALTER INDEX upper_ix RENAME TO upper_name_ix;
Ein weiterer
quelle
Entschuldigung für die Verwendung dieses MySQL-Threads zum Posten einer Oracle-Lösung. Dies liegt daran, dass die von mir gesuchte Frage für Oracle nicht vorhanden war und ich hierher zurückgekommen bin, um meine Frage zu beantworten, als ich die Antwort gefunden habe.
weiterer