Repaso integrado · URL histórica conservada

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.

35–40 minNivel intermedioAntes necesitas: tipos de datos, claves y restricciones

Al terminar, podrás

  • Elegir entre CREATE TABLE y ALTER 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ónComando inicialPregunta 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.

SQL
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.

Resultado después de añadir la columna
idnombreemailtelefono
1Norte Digitalventas@nortedigital.testNULL
2Suministros SurNULLNULL

Valida datos y estructura por separado

Comprobación de datos
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

  1. Describe el estado actual y el estado deseado.
  2. Comprueba cuántas filas y dependencias pueden verse afectadas.
  3. Revisa la sintaxis y las limitaciones del motor y de su versión.
  4. Ensaya con una copia y prepara una forma de recuperación.
  5. Valida datos, restricciones y consultas después del cambio.

La operación determina el coste y la sintaxis

CambioRiesgo principalPortabilidad
Añadir una columna opcionalDependencias y valor inicial de filas existentesComún, con restricciones específicas
Cambiar tipo o nulabilidadConversión, validación y posible reescrituraLa sintaxis varía mucho
Renombrar o eliminarRomper consultas, vistas o código externoCapacidades distintas por versión
Añadir una clave o restricciónDatos actuales que incumplen la nueva reglaDebe 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 TABLE es portable o reversible.

Qué debes recordar

  • CREATE TABLE define una estructura nueva; ALTER TABLE modifica 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.

Recorrido recomendado

Fuentes técnicas consultadas