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;
idnombrepresupuestoestado
1Rediseño web15000.00planificado
2App móvil45000.00planificado
3Migración cloud80000.00planificado

Añadir al principio con FIRST

ALTER TABLE proyectos
    ADD COLUMN codigo CHAR(6) FIRST;
DESCRIBE proyectos;
FieldTypeNullKeyDefaultExtra
codigochar(6)YESNULL
idintNOPRINULLauto_increment
nombrevarchar(100)NONULL
presupuestodecimal(12,2)YESNULL
estadovarchar(20)YESplanificado

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;
idcodigo_proyectonombre
1PRY-001Rediseño web
2PRY-002App móvil
3PRY-003Migració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\G

Limpieza

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