¿Cómo mover columnas en una tabla MySQL?

207

Actualmente estoy teniendo la siguiente tabla MySQL: Employees (empID, empName, department);

Quiero cambiar la tabla a la siguiente: Employees (empID, department, empName);

¿Cómo se puede hacer esto usando ALTERdeclaraciones?

Nota: Quiero cambiar solo las posiciones de columna.

sumitir
fuente
¿Puedo preguntar por qué? El orden de las columnas es prácticamente un problema estético ...
deceze
66
@deceze tal vez no: define el orden de los valores en una SELECT *declaración. (De acuerdo, si el orden de los valores es importante, uno debería enumerarlos explícitamente en la declaración, pero tal vez OP no tiene control total aquí.)
Ted Hopp
1
Sé que no afecta nada. Mi tabla original tiene muchas columnas, así que acabo de agregar 3 columnas que se agregaron en la última. Pero quiero que se muestren en las posiciones 3-4-5 para facilitar el uso de la SELECTdeclaración
sumitir el
66
@iSumitG: Tenga en cuenta que también AFTER columnse puede usar con ALTER TABLE ADD column. (para la próxima vez que agregue algunos campos.)
ypercubeᵀᴹ
2
Si carga un volcado de mysql, usa insertar en valores. Entonces, si, por ejemplo, está cargando datos de prod en dev y las columnas están fuera de servicio, obtendrá un error. Es por eso que uno podría querer hacer esto.
Hooray Im Helping

Respuestas:

345

Si empName es una columna VARCHAR (50):

ALTER TABLE Employees MODIFY COLUMN empName VARCHAR(50) AFTER department;

EDITAR

Según los comentarios, también puedes hacer esto:

ALTER TABLE Employees CHANGE COLUMN empName empName VARCHAR(50) AFTER department;

Tenga en cuenta que la repetición de empNamees deliberada. Tiene que decirle a MySQL que desea mantener el mismo nombre de columna.

Debe tener en cuenta que ambas versiones de sintaxis son específicas de MySQL. No funcionarán, por ejemplo, en PostgreSQL o en muchos otros DBMS.

Otra edición: como señaló @Luis Rossi en un comentario, debe especificar completamente la definición de columna alterada justo antes del AFTERmodificador. Los ejemplos anteriores solo tienen VARCHAR(50), pero si necesita otras características (como NOT NULLo un valor predeterminado), también debe incluirlas. Consulte los documentos enALTER TABLE para más información.

Ted Hopp
fuente
66
Solo una nota: MODIFICAR no es compatible hasta la versión 4.
Erre Efe
44
Debe repetir el nombre de la columna, porque la sintaxis supone que es posible que desee cambiar el nombre de la columna. Por ejemplo: ALTERAR TABLA Empleados CAMBIAR COLUMNA empName empName varchar (50) DESPUÉS del departamento;
brianjcohen
Tenga en cuenta que el orden modificado no se reflejará en los volcados de SQL de la base de datos.
skalee
3
@SalehEnamShohag: Sí, según los documentos , la COLUMNpalabra clave es opcional en las ALTER TABLEdeclaraciones. Prefiero usarlo porque creo que hace que la declaración sea más legible.
Ted Hopp
1
Funciona bien para mí, en mi caso necesitaba definir que la columna era NOT NULL DEFAULT 1, esto se hace justo después del tipo de columna en el ejemploVARCHAR(50)
Luiz Rossi
67

Cambiar posición de columna:

ALTER TABLE Employees 
   CHANGE empName empName VARCHAR(50) NOT NULL AFTER department;

Si necesita moverlo a la primera posición, debe usar el término PRIMERO al final de la consulta ALTER TABLE CHANGE [COLUMN]:

ALTER TABLE UserOrder 
   CHANGE order_id order_id INT(11) NOT NULL FIRST;
Igor Kostin
fuente
24
Mencionar cómo moverlo a la primera posición fue bastante útil
Tristian
2
¿Alguna idea de cómo funcionaría esto en una mesa grande? ¿Solo está cambiando algunos metadatos o realmente tiene que reorganizar los datos en el disco?
Kip
66
no importa, respondí mi propia pregunta probándola en una mesa que tenía con 3.9 millones de filas, me llevó unos 2 minutos. por lo que definitivamente está haciendo más que solo intercambiar algunos metadatos.
Kip
14

phpMyAdmin proporciona una GUI para esto dentro de la vista de estructura de una tabla. Marque para seleccionar la columna que desea mover y haga clic en la acción de cambio en la parte inferior de la lista de columnas. Luego puede cambiar todas las propiedades de la columna y encontrará la función 'mover columna' en el extremo derecho de la pantalla.

Por supuesto, todo esto es solo construir las consultas en la respuesta superior perfectamente buena, pero los fanáticos de la GUI pueden apreciar la alternativa.

mi versión de phpMyAdmin es 4.1.7


fuente
1
La pregunta pregunta específicamente "¿Cómo se puede hacer esto usando declaraciones ALTER?". No todos los que ejecutan MySQL usan phpMyAdmin.
Caleb
3
Aprendo mucho de lo que hago hoy en día en una línea de comandos al observar el resultado de la consulta desde herramientas GUI como phpMyAdmin. Estoy feliz de que esta publicación obtenga tantos votos negativos como la gente considere conveniente sobre esta base: 1 persona verá esto, hará su trabajo en un entorno en el que se sienta cómodo, aprenderá un poco y seguirá adelante.
para esta acción phpmyadmi no muestra el comando que realiza la acción. No lo encontré
Tebe
2
Wow, tanta ira por una solución alternativa que hace el truco y complementa las respuestas que el OP solicitó para un ALTER SQL.
Ewen
1

Tuve que ejecutar esto para una columna introducida en las etapas posteriores de un producto, en más de 10 tablas. Entonces escribí este script rápido y desordenado para generar el comando alter para todas las tablas 'relevantes'.

SET @NeighboringColumn = '<YOUR COLUMN SHOULD COME AFTER THIS COLUMN>';

SELECT CONCAT("ALTER TABLE `",t.TABLE_NAME,"` CHANGE COLUMN `",COLUMN_NAME,"` 
`",COLUMN_NAME,"` ", c.DATA_TYPE, CASE WHEN c.CHARACTER_MAXIMUM_LENGTH IS NOT 
NULL THEN CONCAT("(", c.CHARACTER_MAXIMUM_LENGTH, ")") ELSE "" END ,"  AFTER 
`",@NeighboringColumn,"`;")
FROM information_schema.COLUMNS c, information_schema.TABLES t
WHERE c.TABLE_SCHEMA = '<YOUR SCHEMA NAME>'
AND c.COLUMN_NAME = '<COLUMN TO MOVE>'
AND c.TABLE_SCHEMA = t.TABLE_SCHEMA
AND c.TABLE_NAME = t.TABLE_NAME
AND t.TABLE_TYPE = 'BASE TABLE'
AND @NeighboringColumn IN (SELECT COLUMN_NAME 
    FROM information_schema.COLUMNS c2 
    WHERE c2.TABLE_NAME = t.TABLE_NAME);
Uchamp
fuente