¿Cómo cambio el nombre de un índice en MySQL?


82

Me gustaría cambiar el nombre de un índice. He mirado la documentación de la tabla de alteración , pero no puedo encontrar la sintaxis para simplemente cambiar el nombre de un índice. Al hacerlo a través de la GUI de MySQL, elimina el índice y crea uno nuevo. Si bien esto funciona, me gustaría evitar la reconstrucción de todo el índice solo para cambiar el nombre de un índice.

[INFORMACIÓN ADICIONAL]

En la documentación de la tabla alter dice

Las alteraciones que modifican solo los metadatos de la tabla y no los datos de la tabla se pueden realizar de inmediato alterando el archivo .frm de la tabla y sin tocar el contenido de la tabla. Los siguientes cambios son alteraciones rápidas que se pueden realizar de esta manera:

* Renaming a column or index.

Sin embargo, cuando intenté cambiar el nombre del índice editando el archivo .frm (en una base de datos de prueba) y reiniciando el servidor, ahora dice "No se pudieron recuperar las columnas" en la interfaz de usuario al intentar enumerar las columnas y al intentar ejecutar una consulta, devuelve el error "Motor de tabla desconocido ''". El archivo .frm tiene mucho contenido binario. ¿Existe una buena herramienta para editar la información binaria?

Respuestas:


144

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 ALTER TABLE RENAME INDEXsintaxis.

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

  • RENAME INDEX old_index_name TO new_index_namecambia 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_namedebe ser el nombre de un índice existente en la tabla que no es eliminado por la misma ALTER TABLEinstrucción. new_index_namees el nuevo nombre de índice, que no puede duplicar el nombre de un índice en la tabla resultante después de que se hayan aplicado los cambios. Ninguno de los nombres de índice puede ser PRIMARY.

Las versiones anteriores de MySQL, por ejemplo, 5.6 y anteriores, no admiten sintaxis ALTER TABLEpara cambiar el nombre de un índice (o clave, que es un sinónimo).

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

No hay ningún ALTER INDEXcomando en MySQL. Solo puede DROP INDEXy luego CREATE INDEXcon el nuevo nombre.


Con respecto a su actualización anterior: quizás la documentación no sea lo suficientemente precisa. Independientemente, no hay sintaxis 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 los índices periódicamente OPTIMIZE TABLE). Lleva 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 agregar o soltar un índice no debería necesitar tocar los datos de la tabla, como dice la documentación.

En cuanto al .frmarchivo, MySQL no admite la edición del .frmarchivo. No lo haría por ningún motivo. Tiene 100% de garantía de dañar su mesa y dejarla inutilizable.



22
Trivia: ¡el estándar SQL no dice nada sobre índices! Es puramente 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.
Bill Karwin

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

60

Para MySQL 5.7:

ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name

Para versiones anteriores 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


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

3

Esta pregunta se hizo hace mucho tiempo y se actualizó por última vez hace más de medio año. Aún siento la necesidad de agregar este consejo:

Si la columna indexada se usa en otro lugar como 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 encuentre esto útil.


5
Esto se ve mal, ¿no podría simplemente cambiar el orden al soltar y agregar? y mantener los controles activos? ALTER TABLE tbl ADD INDEX new_index_name (indexed_column), DROP INDEX index_name
Puggan Se

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

Confundido de cómo FK se vería afectado por un índice. No está cambiando los datos, solo el índice de los datos.
gdbj

@gdbj Las restricciones de clave externa dependen de un índice, por lo que no creo que pueda eliminar un índice utilizado por una restricción de clave externa.
Charles Wood
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.