2009-09-23 8 views
60

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

[Plus d'infos]

Dans la documentation alter table il indique

modifications qui ne modifions que la table métadonnées et non des données de table peuvent être fait immédiatement en modifiant le fichier .frm de la table et ne pas toucher le contenu de la table . Les modifications suivantes sont des modifications rapides qui peuvent être faites cette façon:

* Renaming a column or index. 

Cependant, quand j'ai essayé de renommer l'index en éditant le fichier .frm (sur une base de données de test) et le redémarrage du serveur, il indique maintenant "Impossible d'extraire des colonnes" dans l'interface utilisateur lorsque vous essayez de lister les colonnes et lorsque vous tentez d'exécuter une requête, il renvoie l'erreur "Moteur de table inconnu" "". Le fichier .frm contient beaucoup de contenu binaire. Y at-il un bon outil pour éditer l'information binaire.

Répondre

107

J'ai répondu à cette question en 2009. À l'é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. Ceci est une extension MySQL au 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 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 que les modifications ont été appliquées. Aucun nom d'index ne peut être PRIMARY.

Les versions antérieures de MySQL, par ex. 5.6 et les 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 seulement DROP INDEX puis CREATE INDEX avec le nouveau nom. En ce qui concerne 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 des index avec OPTIMIZE TABLE). Cela prend du temps, mais c'est une opération banale. Les structures de données d'index étant séparées des données de table, l'ajout ou la suppression d'un index ne devrait pas avoir à toucher les données de la table, comme le dit la documentation.En ce qui concerne le fichier .frm, MySQL ne prend pas en charge l'édition du fichier .frm en ce qui concerne le fichier .frm. Je ne le ferais pas pour une raison quelconque. Vous êtes garanti à 100% de corrompre votre table et de la rendre inutilisable.


+17

Anecdote: la norme SQL dit rien du tout sur les index! C'est purement un problème de mise en œuvre du fournisseur lié à l'optimisation, donc toute la syntaxe liée aux index est propriétaire, dans toutes les marques de base de données SQL. –

+1

Oui, c'est à peu près ce qui s'est passé. Même fait MySQL se bloquer lors de l'édition du fichier de façon incorrecte. Marquer cela comme correct. Idéalement, vous pouvez simplement renommer l'index, car ce ne sont que des métadonnées, mais il semble que cela n'existe pas. – Kibbee

40

Pour MySQL 5.7:

ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name 

Pour MySQL anciennes versions:

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

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

+5

Faites attention en laissant tomber et en ajoutant de nouveaux index, si c'est une grande table cela peut prendre beaucoup de temps. Une excellente façon de le faire sur une grande table est d'utiliser pt-online-schema-change: http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html – jbrahy

3

a posé cette question il y a des siècles, et a été mise à jour plus d'un demi il y'a un an. Encore je ressens le besoin d'ajouter cette astuce:

Si la colonne indexée est utilisée ailleurs comme une 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; 

Espérons que quelqu'un trouve cela utile.

+5

les coutures sont mauvaises, ne pourriez-vous pas simplement changer d'ordre et laisser tomber? et garder les chèques actifs? 'ALTER TABLE tbl ADD INDEX nouveau_index_name (indexed_column), DROP INDEX index_name' –

+0

Devrait probablement faire cela c'est propre réponse Puggan Se, comme c'est le moyen le plus efficace/plus sûr pour mysql avant 5.7 – xref

-1

Pour Oracle 11g (au moins), il est comme ceci:

ALTER INDEX upper_ix RENAME TO upper_name_ix; 
Questions connexes