77 votes

Comment renommer un index dans MySQL ?

Je voudrais renommer un index. J'ai consulté le modifier la table mais je n'arrive pas à trouver la syntaxe pour renommer simplement un index. Lorsque je le fais via l'interface graphique de MySQL, l'index est supprimé et un nouveau est créé. Bien que cela fonctionne, je voudrais éviter de reconstruire l'ensemble de l'index juste pour changer le nom d'un index.

[INFORMATIONS COMPLÉMENTAIRES]

Dans la documentation sur la modification des tables, il est indiqué

Modifications qui ne modifient que le tableau et non les données de la table peuvent être immédiatement en modifiant le fichier le fichier .frm de la table et sans toucher au le contenu de la table. Les modifications suivantes sont des modifications rapides qui peuvent être effectué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, l'interface utilisateur indique maintenant "Could not fetch columns" (Impossible de récupérer les colonnes) lorsqu'on essaie de répertorier les colonnes, et lorsqu'on essaie d'exécuter une requête, l'erreur "Unknown table engine ''" est renvoyée. Le fichier .frm contient beaucoup de contenu binaire. Existe-t-il un bon outil pour modifier les informations binaires ?

134voto

Bill Karwin Points 204877

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

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

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 du SQL standard. Le contenu de la table reste inchangé. old_index_name doit être le nom d'un index existant dans la table qui n'est pas supprimé par le même ALTER TABLE déclaration. new_index_name est le nouveau nom de l'index, qui ne peut pas dupliquer le nom d'un index dans la table résultante après que les changements aient été appliqués. Aucun des deux noms d'index ne peut être PRIMARY .

Les versions antérieures de MySQL, par exemple 5.6 et antérieures, ne prennent pas en charge la syntaxe en 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 ALTER INDEX dans MySQL. Vous pouvez seulement DROP INDEX et ensuite CREATE INDEX avec le nouveau nom.


Concernant votre mise à jour ci-dessus : peut-être la documentation n'est-elle pas assez précise. Quoi qu'il en soit, il n'existe 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 les index périodiquement avec le logiciel de gestion des index). OPTIMIZE TABLE ). Cela prend un certain temps, mais c'est une opération banale. Les structures de données des index sont séparées des données de la table, donc ajouter ou supprimer un index ne devrait pas avoir besoin de toucher aux données de la table, comme le dit la documentation.

En ce qui concerne le .frm MySQL ne prend pas en charge l'édition du fichier .frm fichier. Je ne le ferais pas pour n'importe quelle raison. Vous êtes sûr à 100% de corrompre votre table et de la rendre inutilisable.


54voto

joelparkerhenderson Points 10128

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 (...)

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

3voto

Ifedi Okonkwo Points 53

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 néanmoins 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. Faire ceci 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X