Contenido de esta guía
Qué significa modificar una estructura
Modificar la estructura de una tabla cambia su definición: columnas, tipos, valores predeterminados, restricciones o nombre. Es una operación distinta de UPDATE, que cambia los valores almacenados en filas existentes.
ALTER TABLE permite evolucionar un esquema sin borrar la tabla, pero el cambio puede afectar datos, índices, vistas, claves foráneas y código de la aplicación.
Antes de escribir la sentencia
- Describe el estado actual y el estado deseado.
- Busca consultas, vistas, restricciones e índices que dependan de la columna.
- Comprueba si los datos existentes cumplen la nueva regla.
- Revisa la sintaxis y el coste en la versión concreta del motor.
- Prepara copia de seguridad, prueba y reversión.
Operaciones habituales
| Necesidad | Familia de operación | Riesgo principal |
|---|---|---|
| Añadir un dato nuevo | ADD COLUMN | Valores iniciales y restricciones |
| Cambiar tipo o nulabilidad | ALTER/MODIFY COLUMN | Conversión, escaneo o reescritura |
| Eliminar un dato | DROP COLUMN | Pérdida y dependencias |
| Renombrar | RENAME o herramienta específica | Código que conserva el nombre anterior |
| Añadir una regla | ADD CONSTRAINT | Filas antiguas que la incumplen |
Ejemplo guiado: añadir un dato opcional
ALTER TABLE clientes
ADD COLUMN telefono VARCHAR(30);La operación crea la columna al final de la definición. Como no se declara NOT NULL ni un DEFAULT, las filas existentes reciben NULL. Esto permite incorporar la estructura primero y completar los datos después.
| columna | tipo | valor en filas existentes |
|---|---|---|
| id | INTEGER | sin cambios |
| nombre | TEXT | sin cambios |
| telefono | VARCHAR(30) | NULL |
La sentencia se comprobó en SQLite con el esquema educativo. En producción, verifica además permisos, bloqueos, dependencias y forma de despliegue.
PRAGMA table_info(clientes);| name | type | notnull | dflt_value |
|---|---|---|---|
| telefono | VARCHAR(30) | 0 | NULL |
Verificar el esquema evita dar por terminado un despliegue solo porque la sentencia no mostró un error. Comprueba también una muestra de filas y los objetos dependientes.
Una secuencia de cambio segura
Expandir, migrar y restringir suele ser más seguro que imponer todo en una sola sentencia: añade una columna compatible, adapta la aplicación, completa datos en lotes y solo después aplica NOT NULL o restricciones.
Esta secuencia reduce el intervalo en que una aplicación antigua y una estructura nueva son incompatibles. No todos los motores permiten revertir DDL del mismo modo; una transacción no sustituye a una copia de seguridad ni a un plan de retorno.
Errores frecuentes
Añadir una regla que las filas existentes no pueden cumplir
Una columna NOT NULL sin valor compatible puede fallar cuando la tabla ya contiene filas. Una restricción CHECK o una conversión de tipo también puede exigir revisar todos los datos.
Otro error es copiar la sintaxis de otro motor: PostgreSQL usa ALTER COLUMN ... TYPE, MySQL utiliza MODIFY COLUMN para muchas modificaciones y SQL Server usa ALTER COLUMN.
Comprueba lo aprendido
Añade un código postal sin bloquear datos antiguos
La tabla clientes necesita codigo_postal de hasta 12 caracteres. Las filas antiguas aún no tienen ese dato, pero el objetivo final es que sea obligatorio. Propón las tres fases del cambio.
NULL.NOT NULL solo cuando la comprobación devuelva cero.Solución razonada
-- 1. Expandir
ALTER TABLE clientes
ADD COLUMN codigo_postal VARCHAR(12);
-- 2. Migrar datos (ejemplo)
UPDATE clientes
SET codigo_postal = 'PENDIENTE'
WHERE codigo_postal IS NULL;
SELECT COUNT(*) AS pendientes
FROM clientes
WHERE codigo_postal IS NULL;
-- 3. Restringir con la sintaxis del motor
-- ALTER TABLE ... SET NOT NULLLa tercera fase debe adaptarse al motor y a su versión. PostgreSQL y otros motores ofrecen operaciones directas para varias restricciones; SQLite 3.53.0 o posterior también permite ALTER TABLE ... ALTER COLUMN ... SET NOT NULL y DROP NOT NULL. Si el cambio que necesitas no tiene una operación directa en tu motor, recrea la tabla de forma controlada. El punto clave es que la consulta de comprobación devuelva 0 antes de imponer la regla.
Compatibilidad entre motores
PostgreSQL documenta una familia amplia para añadir, eliminar, renombrar y cambiar columnas y restricciones. SQL Server también modifica columnas y restricciones, con variantes según el tipo de tabla. SQLite admite directamente renombrar tablas o columnas, añadir y eliminar columnas y, desde la versión 3.53.0, establecer o retirar NOT NULL con ALTER COLUMN. Para otros cambios arbitrarios sigue documentando el procedimiento de crear una tabla nueva, copiar los datos y sustituir la anterior. Comprueba siempre la versión, porque las capacidades evolucionan.
Qué debes recordar
- DDL cambia la definición; DML cambia las filas.
- Un cambio de esquema puede afectar objetos y aplicaciones dependientes.
- Primero comprueba los datos existentes y el coste real.
- Divide los cambios incompatibles en fases.