2009-09-23 17 views
60

Me gustaría cambiar el nombre de un índice. Miré la documentación de alter table, pero no puedo entender la sintaxis para simplemente cambiar el nombre de un índice. Al hacerlo a través de la GUI de MySQL, deja caer el índice y crea uno nuevo. Mientras esto funcione, me gustaría evitar reconstruir todo el índice solo para cambiar el nombre de un índice.Cómo cambio el nombre de un índice en MySQL

[INFO ADICIONAL]

En la documentación de modificación de tabla que indica

Las alteraciones que modifican la única mesa metadatos y no datos de la tabla pueden ser hecho de inmediato mediante la alteración de archivos .frm de la tabla y sin tocar el contenido de la tabla . Los siguientes cambios son alteraciones rápidas que se pueden hacer esta manera:

* Renaming a column or index. 

Sin embargo, cuando traté de cambiar el nombre del índice mediante la edición del archivo .frm (en una base de datos de prueba) y reiniciar el servidor, ahora indica "No se pudieron recuperar columnas" en la interfaz de usuario al intentar enumerar las columnas, y cuando se intenta ejecutar una consulta, se devuelve el error "Motor de tabla desconocida". El archivo .frm tiene mucho contenido binario. ¿Hay una buena herramienta para editar la información binaria?

Respuesta

107

Respondí esta pregunta en 2009. En ese momento no había sintaxis en MySQL para cambiar el nombre de un índice.

Desde entonces, MySQL 5.7 introdujo una sintaxis ALTER TABLE RENAME INDEX.

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

  • RENAME INDEX old_index_name TO new_index_name cambia el nombre de un índice. Esta es una extensión de MySQL para SQL estándar. El contenido de la tabla permanece sin cambios. old_index_name debe ser el nombre de un índice existente en la tabla que no se descarta en la misma instrucción ALTER TABLE. new_index_name es el nuevo nombre de índice, que no puede duplicar el nombre de un índice en la tabla resultante después de aplicar los cambios. Ninguno de los dos nombres puede ser PRIMARY.

Versiones anteriores de MySQL, p. Ej. 5.6 y anteriores, no admiten sintaxis en ALTER TABLE para cambiar el nombre de un índice (o clave, que es un sinónimo).

La única solución fue ALTER TABLE DROP KEY oldkeyname, ADD KEY newkeyname (...).

No existe el comando ALTER INDEX en MySQL. Solo puede DROP INDEX y luego CREATE INDEX con el nuevo nombre.


En relación con su actualización anterior: quizás la documentación no sea lo suficientemente precisa. De todos modos, no hay sintaxis de SQL para cambiar el nombre de un índice.

Un índice es una estructura de datos que se puede reconstruir a partir de los datos (de hecho, se recomienda reconstruir índices periódicamente con OPTIMIZE TABLE). Toma algo de tiempo, pero es una operación común. Las estructuras de datos de los índices están separadas de los datos de la tabla, por lo que no es necesario que agregue o elimine un índice para tocar los datos de la tabla, como dice la documentación.

Con respecto al archivo .frm, MySQL no admite la edición del archivo .frm. No lo haría por ninguna razón. Está 100% garantizado para corromper su tabla y hacerla inutilizable.


+17

Anécdota: el estándar SQL no dice nada en absoluto acerca de los índices! Se trata simplemente de un problema de implementación del proveedor relacionado con la optimización, por lo que toda la sintaxis relacionada con los índices es propietaria, en todas las marcas de bases de datos SQL. –

+1

Sí, eso es más o menos lo que sucedió. Incluso hizo que MySQL fallara al editar el archivo incorrectamente. Marcando esto como correcto. Idealmente, podría cambiar el nombre del índice, porque solo se trata de metadatos, pero parece que funcionalmente no existe. – Kibbee

40

Para MySQL 5.7:

ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name 

Para MySQL versiones anteriores:

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

+5

Tenga cuidado al colocar y agregar nuevos índices; si se trata de una mesa grande, puede llevar mucho tiempo. Una excelente manera de hacerlo en una mesa grande es utilizar pt-online-schema-change: http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html – jbrahy

3

Esta pregunta se hizo hace años, y se actualizó por última vez hace más de medio Hace años. Todavía siento la necesidad de agregar este consejo:

Si la columna indexada se utiliza en otro lugar como una clave externa, puede encontrar un error relacionado con eso. Hacer esto puede ayudar:

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; 

Espero que alguien lo encuentre útil.

+5

This las costuras son malas, ¿no podrías simplemente cambiar de orden al soltar y agregar? y mantener los controles activos? 'ALTER TABLE tbl ADD INDEX new_index_name (indexed_column), DROP INDEX index_name' –

+0

Probablemente debería hacer que esta sea su propia respuesta Puggan Se, ya que es la forma más eficiente/más segura para mysql antes de 5.7 – xref

-1

Para Oracle 11g (al menos) es la siguiente:

ALTER INDEX upper_ix RENAME TO upper_name_ix; 
Cuestiones relacionadas