Aprende SQL · lección gratuita
Las tablas evolucionan: se agregan columnas, se renombran, se eliminan tablas obsoletas y se conectan entre sí con claves foráneas (FOREIGN KEY). ALTER TABLE cambia la estructura de una tabla existente; DROP TABLE la elimina por completo; una FOREIGN KEY enlaza una tabla hija con su padre para garantizar integridad referencial.
ALTER TABLE ... ADD COLUMN: añade una columna nueva. Debe tener DEFAULT o admitir NULL (no puede ser NOT NULL sin default si la tabla tiene filas).ALTER TABLE ... RENAME COLUMN ... TO ...: renombra una columna (SQLite ≥ 3.25).ALTER TABLE ... RENAME TO ...: renombra la tabla completa.DROP TABLE [IF EXISTS]: elimina la tabla y todos sus datos. IF EXISTS evita el error si no existe (clave para idempotencia).FOREIGN KEY (col) REFERENCES padre(id): obliga a que col apunte a una fila existente del padre. Se activa con PRAGMA foreign_keys = ON.Límites de ALTER en SQLite. SQLite tiene un ALTER TABLE reducido: soporta ADD COLUMN, RENAME COLUMN, RENAME TO y DROP COLUMN (≥ 3.35), pero no permite agregar restricciones complejas ni cambiar tipos sobre una tabla con datos. El patrón clásico para cambios grandes es: crear tabla nueva con la estructura deseada, INSERT ... SELECT los datos, DROP la vieja y RENAME la nueva.
Claves foráneas. Una FOREIGN KEY se declara en el CREATE TABLE de la tabla hija. En SQLite la verificación de FK está desactivada por defecto; debes ejecutar PRAGMA foreign_keys = ON;. Con FK activas:
ON DELETE CASCADE: al borrar el padre, se borran las hijas. ON DELETE RESTRICT (default): impide borrar el padre si tiene hijas.DROP TABLE es destructivo e irreversible (fuera de transacción). IF EXISTS lo hace seguro en scripts repetibles.
SELECT id, empresa, pais FROM clientes ORDER BY id LIMIT 5
-- Reconstrucción idempotente: padre + hija con FK
DROP TABLE IF EXISTS pedidos_demo;
DROP TABLE IF EXISTS clientes_demo;
CREATE TABLE clientes_demo (
id INTEGER PRIMARY KEY,
empresa TEXT NOT NULL
);
CREATE TABLE pedidos_demo (
id INTEGER PRIMARY KEY,
cliente_id INTEGER NOT NULL,
total INTEGER NOT NULL,
FOREIGN KEY (cliente_id) REFERENCES clientes_demo(id)
);
INSERT INTO clientes_demo (id, empresa) VALUES (1, 'TechNova'), (2, 'DataSphere');
INSERT INTO pedidos_demo (id, cliente_id, total) VALUES (1, 1, 5000), (2, 2, 8000);
-- ALTER: agregar columna con DEFAULT y renombrar otra
ALTER TABLE pedidos_demo ADD COLUMN estado TEXT NOT NULL DEFAULT 'Pendiente';
ALTER TABLE pedidos_demo RENAME COLUMN total TO monto;
SELECT p.id, c.empresa, p.monto, p.estado
FROM pedidos_demo p
JOIN clientes_demo c ON c.id = p.cliente_id
ORDER BY p.id;
💡 En SQLiteALTER TABLEes limitado: no cambia tipos ni añadeCHECKsobre tablas con datos. Para cambios estructurales grandes, usa el patrón crear-copiar-soltar-renombrar. Y recuerdaPRAGMA foreign_keys = ON;o las FK no se respetarán.
| Sentencia | Qué hace |
|---|---|
ALTER TABLE t ADD COLUMN c TIPO DEFAULT v; | Agrega una columna |
ALTER TABLE t RENAME COLUMN a TO b; | Renombra una columna |
ALTER TABLE t RENAME TO nuevo; | Renombra la tabla |
DROP TABLE IF EXISTS t; | Elimina la tabla (idempotente) |
FOREIGN KEY (c) REFERENCES p(id) | Enlaza hija con padre |
PRAGMA foreign_keys = ON; | Activa la verificación de FK |
---
← Crear tablas y restricciones: CREATE TABLEVistas: CREATE VIEW →