¿Cómo mover columnas en una tabla MySQL?
Actualmente tengo 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 ALTER
declaraciones?
Nota: quiero cambiar solo las posiciones de las columnas.
Si empName
es una VARCHAR(50)
columna:
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 empName
es deliberada. Tienes que decirle a MySQL que quieres mantener el mismo nombre de columna.
Debes tener en cuenta que ambas versiones de sintaxis son específicas de MySQL. No funcionarán, por ejemplo, en PostgreSQL ni en muchos otros DBMS.
Otra edición: como señaló @Luis Rossi en un comentario, debe especificar completamente la definición de columna modificada justo antes del AFTER
modificador. Los ejemplos anteriores solo tienen VARCHAR(50)
, pero si necesita otras características (como NOT NULL
un valor predeterminado), debe incluirlas también. Consulte los documentosALTER TABLE
para obtener más información.
Cambiar la posición de la 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 [COLUMNA]:
ALTER TABLE UserOrder
CHANGE order_id order_id INT(11) NOT NULL FIRST;
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 simplemente construir las consultas en la respuesta principal perfectamente buena, pero los fanáticos de la GUI podrían apreciar la alternativa.
mi versión de phpMyAdmin es 4.1.7
Tuve que ejecutar esto para una columna introducida en las últimas etapas de un producto, en más de 10 tablas. Así que escribí este script rápido y desordenado para generar el comando de modificación 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);