web-dev-qa-db-fra.com

Comment renommer un index dans MySQL

Je voudrais renommer un index. J'ai regardé la documentation alter table , mais je ne peux pas comprendre la syntaxe pour renommer simplement un index. Lorsque vous le faites via l'interface graphique MySQL, il supprime l'index et en crée un nouveau. Pendant que cela fonctionne, je voudrais éviter de reconstruire l'index entier juste pour changer le nom d'un index.

[INFORMATION ADDITIONNELLE]

Dans la documentation alter table, il indique

Les modifications qui modifient uniquement les métadonnées de table et non les données de table peuvent être effectuées immédiatement en modifiant le fichier .frm de la table et sans toucher au contenu de la table. Les modifications suivantes sont des modifications rapides qui peuvent être apportées de cette façon:

* Renaming a column or index.

Cependant, lorsque j'ai essayé de renommer l'index en modifiant le fichier .frm (sur une base de données de test) et en redémarrant le serveur, il indique désormais "Impossible de récupérer les colonnes" dans l'interface utilisateur lors de la tentative de listage des colonnes et lors de l'exécution. une requête, il renvoie l'erreur "Moteur de table inconnu '" ". Le fichier .frm a beaucoup de contenu binaire. Existe-t-il un bon outil pour éditer les informations binaires.

75
Kibbee

J'ai répondu à cette question en 2009. A cette époque, il n'y avait pas de syntaxe dans MySQL pour renommer un index.

Depuis lors, MySQL 5.7 a introduit une syntaxe ALTER TABLE RENAME INDEX.

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

  • RENAME INDEX old_index_name TO new_index_name Renomme un index. Il s'agit d'une extension MySQL au SQL standard. Le contenu du tableau reste inchangé. old_index_name Doit être le nom d'un index existant dans la table qui n'est pas supprimé par la même instruction ALTER TABLE. new_index_name Est le nouveau nom d'index, qui ne peut pas dupliquer le nom d'un index dans la table résultante après l'application des modifications. Aucun des noms d'index ne peut être PRIMARY.

Versions antérieures de MySQL, par exemple 5.6 et versions antérieures, ne prennent en charge aucune syntaxe dans ALTER TABLE pour renommer un index (ou une clé, qui est un synonyme).

La seule solution était de ALTER TABLE DROP KEY oldkeyname, ADD KEY newkeyname (...).

Il n'y a pas de commande ALTER INDEX Dans MySQL. Vous pouvez uniquement DROP INDEX puis CREATE INDEX avec le nouveau nom.


Concernant votre mise à jour ci-dessus: la documentation n'est peut-être pas assez précise. Quoi qu'il en soit, il n'y a pas de syntaxe SQL pour renommer un index.

Un index est une structure de données qui peut être reconstruite à partir des données (en fait, il est recommandé de reconstruire périodiquement les index avec OPTIMIZE TABLE). Cela prend un certain temps, mais c'est une opération courante. Les structures de données d'index sont distinctes des données de table, donc l'ajout ou la suppression d'un index ne devrait pas avoir besoin de toucher les données de table, comme le dit la documentation.

Concernant le fichier .frm, MySQL ne prend pas en charge la modification du fichier .frm. Je ne le ferais pour aucune raison. Vous avez 100% de garantie de corrompre votre table et de la rendre inutilisable.


130
Bill Karwin

Pour MySQL 5.7:

ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name

Pour les anciennes versions de MySQL:

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

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

52
joelparkerhenderson

Cette question a été posée il y a longtemps et a été mise à jour pour la dernière fois il y a plus de six mois. Je ressens toujours le besoin d'ajouter ce conseil:

Si la colonne indexée est utilisée ailleurs comme clé étrangère, vous pouvez rencontrer une erreur liée à cela. Cela peut aider:

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;

J'espère que quelqu'un trouvera cela utile.

3
Ifedi Okonkwo