Repaso de CREATE TABLE y ALTER TABLE
Decide si necesitas una estructura nueva o una migración sobre una tabla existente, y planifica el cambio antes de tocar datos reales.
Al terminar, podrás
- Elegir entre
CREATE TABLEyALTER TABLE. - Separar el diseño lógico de los pasos de una migración.
- Detectar cuándo una operación necesita documentación específica del motor.
La decisión principal
| Situación | Comando inicial | Pregunta de control |
|---|---|---|
| La entidad aún no existe. | CREATE TABLE | ¿Qué columnas, tipos, claves y reglas necesita desde el principio? |
| La tabla ya existe y debe evolucionar. | ALTER TABLE | ¿Qué datos, restricciones, vistas o aplicaciones dependen del cambio? |
Antes de migrar: inventaria el estado actual
Una sentencia válida puede producir una migración incorrecta si ignora los datos y las dependencias. Antes de escribir SQL, registra al menos:
- la definición actual de la tabla y sus restricciones;
- el número de filas y la presencia de valores nulos o duplicados;
- las vistas, índices, claves foráneas y consultas que usan la columna;
- el estado deseado y una comprobación observable del éxito;
- la estrategia de copia, ensayo y recuperación compatible con el motor.
Una migración tiene dos resultados. Debe dejar un esquema correcto y conservar datos correctos. Comprobar solo que la sentencia terminó sin error no demuestra ninguno de los dos.
Ejemplo: crear y ampliar una tabla
Primero se crea una tabla pequeña de proveedores. Más adelante aparece una necesidad nueva: guardar un teléfono opcional.
CREATE TABLE proveedores (
id INTEGER PRIMARY KEY,
nombre VARCHAR(120) NOT NULL,
email VARCHAR(180) UNIQUE
);
INSERT INTO proveedores (id, nombre, email) VALUES
(1, 'Norte Digital', 'ventas@nortedigital.test'),
(2, 'Suministros Sur', NULL);
ALTER TABLE proveedores
ADD COLUMN telefono VARCHAR(30);
SELECT id, nombre, email, telefono
FROM proveedores
ORDER BY id;La columna nueva es opcional, por lo que las filas existentes reciben NULL. El ejemplo separa nacimiento, carga de datos y evolución del esquema; cada paso puede comprobarse antes de continuar.
| id | nombre | telefono | |
|---|---|---|---|
| 1 | Norte Digital | ventas@nortedigital.test | NULL |
| 2 | Suministros Sur | NULL | NULL |
Valida datos y estructura por separado
SELECT COUNT(*) AS telefonos_pendientes
FROM proveedores
WHERE telefono IS NULL;El resultado es 2. Esa cifra no es un error: describe el trabajo de migración pendiente antes de convertir la columna en obligatoria.
Una migración pequeña también necesita un plan
- Describe el estado actual y el estado deseado.
- Comprueba cuántas filas y dependencias pueden verse afectadas.
- Revisa la sintaxis y las limitaciones del motor y de su versión.
- Ensaya con una copia y prepara una forma de recuperación.
- Valida datos, restricciones y consultas después del cambio.
La operación determina el coste y la sintaxis
| Cambio | Riesgo principal | Portabilidad |
|---|---|---|
| Añadir una columna opcional | Dependencias y valor inicial de filas existentes | Común, con restricciones específicas |
| Cambiar tipo o nulabilidad | Conversión, validación y posible reescritura | La sintaxis varía mucho |
| Renombrar o eliminar | Romper consultas, vistas o código externo | Capacidades distintas por versión |
| Añadir una clave o restricción | Datos actuales que incumplen la nueva regla | Debe verificarse por motor |
PostgreSQL y MySQL ofrecen formas amplias de ALTER TABLE. SQLite documenta un conjunto más limitado de operaciones directas; algunos cambios requieren construir una tabla nueva, copiar los datos y sustituir la anterior. Consulta siempre la versión que realmente vas a desplegar.
La sintaxis de ALTER TABLE no es completamente portable. Añadir una columna sencilla es común, pero cambiar tipos, valores por defecto o restricciones varía entre PostgreSQL, MySQL, SQLite, SQL Server y Oracle.
Error frecuente: mezclar definición y datos sin revisar
Una restricción imposible para las filas actuales
ALTER TABLE proveedores
ADD COLUMN pais VARCHAR(80) NOT NULL;Si la tabla ya contiene filas, el motor necesita resolver el valor de pais para cada una. Una estrategia más segura suele ser añadir la columna como opcional, completar y validar los datos, y aplicar la restricción en un paso posterior compatible con el motor.
Comprueba tu dominio
- Distingues una tabla nueva de una evolución sobre datos existentes.
- Defines el estado inicial, el estado deseado y una prueba observable del cambio.
- No aplicas una restricción obligatoria sin revisar las filas existentes.
- Consultas la documentación del motor antes de asumir que una operación de
ALTER TABLEes portable o reversible.
Qué debes recordar
CREATE TABLEdefine una estructura nueva;ALTER TABLEmodifica una existente.- Una migración afecta tanto a la definición como a los datos y sus dependencias.
- Las diferencias entre motores son parte del problema, no una nota secundaria.