ALTER TABLE: cambiar una tabla
En resumen: ALTER TABLE añade columnas a una tabla existente, las renombra o las quita; SQLite solo puede eso, para todo lo demás se construye una tabla nueva, y DROP TABLE elimina la tabla entera.
Problema
Llama el mensajero
El mensajero llega, y el cliente no abre la puerta. El mensajero quiere un número de teléfono. En customers no hay una columna para el teléfono.
La tabla no se puede crear otra vez: contiene 20 clientes con pedidos, reseñas y fechas de registro. Hay que cambiarla en el sitio.
La idea
ADD COLUMN
ALTER TABLE cambia una tabla que ya existe. ADD COLUMN añade una columna, escrita como en CREATE TABLE:
Los clientes existentes recibieron NULL: sus teléfonos todavía no se conocen. Los datos de las demás columnas no se tocan.
Míralo
Una columna obligatoria en una tabla llena
Marketing quiere una columna «el cliente aceptó el boletín», y obligatoria:
Un error. La tabla ya tiene 20 filas. Si la columna es NOT NULL, ¿qué debe contener para ellas? SQLite no lo sabe, así que se niega.
Con DEFAULT sí lo sabe:
Todos los clientes existentes recibieron 0: no han aceptado hasta que digan lo contrario.
Más precisamente, para curiosos
SQLite tiene más límites con ADD COLUMN. La columna nueva no puede ser UNIQUE ni PRIMARY KEY. Si tiene REFERENCES y la comprobación está activada, DEFAULT debe ser NULL. Un CHECK en la columna nueva está permitido: SQLite lo comprueba también con las filas existentes.
Pruébalo
La unidad
Los productos se venden por unidad, pero pronto algunos se venderán por kilo. Añade a products una columna unit: texto, obligatoria, con el valor por defecto 'ud.'.
Solución
ALTER TABLE products ADD COLUMN unit TEXT NOT NULL DEFAULT 'ud.';ALTER TABLE products ADD COLUMN unit TEXT NOT NULL DEFAULT 'ud.';. Los 25 productos reciben «ud.». Las manzanas se corrigen después con UPDATE.
La idea
RENAME COLUMN y DROP COLUMN
RENAME COLUMN cambia el nombre de una columna. Los datos se quedan:
SQLite cambia el nombre también en el resto del esquema donde se menciona la columna.
DROP COLUMN quita una columna junto con sus datos. La tienda nunca va a enviar un fax:
DROP COLUMN existe en SQLite desde la versión 3.35 (2021). No puede quitar una columna de la que depende el esquema: una clave primaria, una columna UNIQUE, o una columna que usa un índice o una vista.
La idea
Lo que SQLite no puede hacer
El almacén quiere que las existencias nunca sean negativas. Eso es CHECK (stock >= 0) en una columna que ya existe:
SQLite no puede añadir una regla a una columna existente, ni cambiar su tipo. En SQLite, ALTER TABLE solo puede añadir, renombrar y quitar columnas, y renombrar la tabla.
Para todo lo demás se hace una tabla nueva. Así es como las reseñas pasan a tener que llevar texto:
Cuatro pasos: una tabla nueva con la regla, copiar los datos con INSERT … SELECT, DROP TABLE de la antigua y RENAME TO de la nueva. Si una reseña no hubiera tenido texto, la copia se habría detenido en NOT NULL. Entonces primero arreglas los datos.
Más precisamente, para curiosos
PostgreSQL y MySQL pueden más: ALTER TABLE products ADD CONSTRAINT stock_ok CHECK (stock >= 0) y cambiar el tipo de una columna. Para SQLite el procedimiento completo está en la documentación («ALTER TABLE», la sección sobre cambios que no admite directamente). También tiene pasos para las claves foráneas, los índices y los triggers de la tabla antigua. Las reseñas no tienen ninguno de ellos, así que aquí bastan cuatro pasos.
La idea
DROP TABLE
DROP TABLE quita la tabla entera, con todos sus datos. No hay deshacer. La promoción de 2025 terminó hace tiempo:
sqlite_schema es la lista de tablas de SQLite. promo_2025 ya no está. La segunda línea no da error gracias a IF EXISTS. Sin él, quitar una tabla que no existe se detiene:
Una tabla a la que apuntan otras tablas no se puede quitar así. order_items y reviews apuntan a products:
DROP TABLE primero borra todas las filas, y REFERENCES de la lección anterior no lo permite.
Ejercicio
Dos cambios
1. Los mensajeros quieren un teléfono y una nota de entrega («timbre 3, portal B»).
Añade a customers las columnas phone y delivery_note, ambas de texto.
Solución
ALTER TABLE customers ADD COLUMN phone TEXT;
ALTER TABLE customers ADD COLUMN delivery_note TEXT;Dos ALTER TABLE … ADD COLUMN, uno por columna. SQLite añade una sola columna cada vez.
2. En reviews la fecha se llama created_at, y en products se llama added_at. Lo que es igual debería llamarse igual.
Renombra added_at de products a created_at.
Solución
ALTER TABLE products RENAME COLUMN added_at TO created_at;ALTER TABLE products RENAME COLUMN added_at TO created_at;
En un proyecto real el esquema no se cambia a mano en una consola, sino con migraciones: archivos con sentencias ALTER TABLE como estas, que se ejecutan en el mismo orden en cada computadora y servidor. Las verás en el módulo sobre la base de datos en el programa.
Test
Ponte a prueba
Lecciones relacionadas
Sección «Lecciones relacionadas»- Se basa en: INSERT: insertar filas · CREATE TABLE: crear una tabla · Restricciones: reglas para los datos · Claves foráneas: vínculos entre tablas
- Continúa en: Vistas · Claves naturales y desnormalización · Índices · Migraciones del esquema
- Ejercicios sobre el tema: Tablas y reglas