ALTER TABLE ADD COLUMN
La cláusula ADD COLUMN de ALTER TABLE añade una o más columnas nuevas a una tabla existente. Es la operación de modificación de esquema más común: a medida que evolucionan los requisitos de una aplicación, las tablas necesitan nuevas columnas para almacenar información adicional.
Sintaxis
ALTER TABLE nombre_tabla
ADD COLUMN nombre_columna tipo_de_dato [restricciones] [FIRST | AFTER columna_existente];La palabra COLUMN es opcional: ADD nombre_columna y ADD COLUMN nombre_columna son equivalentes. En este artículo usamos la forma explícita por claridad.
Tabla de ejemplo
CREATE TABLE proyectos (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
presupuesto DECIMAL(12, 2)
);
INSERT INTO proyectos (nombre, presupuesto) VALUES
('Rediseño web', 15000.00),
('App móvil', 45000.00),
('Migración cloud', 80000.00);Añadir una columna al final
ALTER TABLE proyectos
ADD COLUMN estado VARCHAR(20) DEFAULT 'planificado';La columna se añade al final de la tabla. Las filas existentes reciben el valor por defecto:
SELECT * FROM proyectos;| id | nombre | presupuesto | estado |
|---|---|---|---|
| 1 | Rediseño web | 15000.00 | planificado |
| 2 | App móvil | 45000.00 | planificado |
| 3 | Migración cloud | 80000.00 | planificado |
Añadir al principio con FIRST
ALTER TABLE proyectos
ADD COLUMN codigo CHAR(6) FIRST;DESCRIBE proyectos;| Field | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| codigo | char(6) | YES | NULL | ||
| id | int | NO | PRI | NULL | auto_increment |
| nombre | varchar(100) | NO | NULL | ||
| presupuesto | decimal(12,2) | YES | NULL | ||
| estado | varchar(20) | YES | planificado |
La columna codigo aparece antes que id.
Añadir después de una columna específica con AFTER
ALTER TABLE proyectos
ADD COLUMN descripcion TEXT AFTER nombre;La columna descripcion se coloca justo después de nombre. La posición de las columnas no afecta al rendimiento ni al almacenamiento interno. Es una cuestión de organización y legibilidad al hacer SELECT * o DESCRIBE.
Añadir columna NOT NULL
Cuando añades una columna NOT NULL a una tabla que ya tiene datos, debes proporcionar un valor por defecto. De lo contrario, MySQL no sabría qué valor asignar a las filas existentes:
-- Esto falla si la tabla tiene datos
ALTER TABLE proyectos
ADD COLUMN responsable VARCHAR(100) NOT NULL;ERROR 1138 (22004): Invalid use of NULL value
La solución es incluir un DEFAULT:
ALTER TABLE proyectos
ADD COLUMN responsable VARCHAR(100) NOT NULL DEFAULT 'Sin asignar';Query OK, 0 rows affected (0.04 sec)
Todas las filas existentes reciben el valor 'Sin asignar'. Las inserciones futuras también usarán ese valor si no se especifica uno explícitamente.
Añadir múltiples columnas
Puedes añadir varias columnas en una sola sentencia:
ALTER TABLE proyectos
ADD COLUMN fecha_inicio DATE AFTER descripcion,
ADD COLUMN fecha_fin DATE AFTER fecha_inicio,
ADD COLUMN prioridad TINYINT DEFAULT 3 CHECK (prioridad BETWEEN 1 AND 5);Cada cláusula ADD COLUMN puede tener su propia posición (FIRST o AFTER). Combinar varias columnas en una sentencia es más eficiente que ejecutar sentencias separadas, ya que MySQL solo necesita reconstruir la tabla una vez.
Añadir columna con UNIQUE
ALTER TABLE proyectos
ADD COLUMN codigo_proyecto VARCHAR(10) UNIQUE;Las filas existentes reciben NULL como valor. La restricción UNIQUE permite múltiples NULL (no se consideran duplicados entre sí), por lo que la operación no falla.
Después de añadir la columna, puedes actualizar los valores:
UPDATE proyectos SET codigo_proyecto = CONCAT('PRY-', LPAD(id, 3, '0'));SELECT id, codigo_proyecto, nombre FROM proyectos;| id | codigo_proyecto | nombre |
|---|---|---|
| 1 | PRY-001 | Rediseño web |
| 2 | PRY-002 | App móvil |
| 3 | PRY-003 | Migración cloud |
Añadir columna con clave foránea
Puedes añadir una columna y su clave foránea en la misma sentencia:
CREATE TABLE clientes_demo (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL
);
ALTER TABLE proyectos
ADD COLUMN cliente_id INT,
ADD CONSTRAINT fk_proyecto_cliente
FOREIGN KEY (cliente_id) REFERENCES clientes_demo(id)
ON DELETE SET NULL;La columna cliente_id admite NULL porque no especificamos NOT NULL. Esto tiene sentido para una clave foránea con ON DELETE SET NULL: si se elimina el cliente, el proyecto no se pierde, solo queda sin cliente asociado.
Añadir columna con valores generados
MySQL 8.0 soporta columnas generadas, cuyo valor se calcula automáticamente a partir de otras columnas:
ALTER TABLE proyectos
ADD COLUMN presupuesto_mensual DECIMAL(12, 2)
GENERATED ALWAYS AS (
CASE
WHEN fecha_inicio IS NOT NULL AND fecha_fin IS NOT NULL
AND TIMESTAMPDIFF(MONTH, fecha_inicio, fecha_fin) > 0
THEN presupuesto / TIMESTAMPDIFF(MONTH, fecha_inicio, fecha_fin)
ELSE presupuesto
END
) STORED;STORED guarda el valor en disco (se calcula al insertar o actualizar). VIRTUAL (el valor por defecto) calcula el valor en cada lectura sin almacenarlo. Las columnas generadas son útiles para desnormalización controlada.
Verificar los cambios
Después de varias modificaciones, la tabla tiene muchas columnas. Usa DESCRIBE para ver el estado actual:
DESCRIBE proyectos;Y SHOW CREATE TABLE para ver la definición completa incluyendo restricciones y claves foráneas:
SHOW CREATE TABLE proyectos\GLimpieza
DROP TABLE IF EXISTS proyectos;
DROP TABLE IF EXISTS clientes_demo;En el siguiente artículo veremos cómo modificar columnas existentes con ALTER TABLE MODIFY COLUMN.
Escrito por Eduardo Lázaro
