Aprende SQL · lección gratuita
CREATE TABLE define la estructura de una tabla: sus columnas, tipos y restricciones (constraints). Las restricciones son reglas que el motor garantiza siempre: integridad de datos por diseño, no por código de aplicación. Es la base del DDL (Data Definition Language).
PRIMARY KEY: identifica unívocamente cada fila; implica UNIQUE + NOT NULL. En SQLite, INTEGER PRIMARY KEY se autoincrementa.NOT NULL: la columna no puede quedar vacía; rechaza INSERT/UPDATE que dejen NULL.UNIQUE: no se permiten valores repetidos en esa columna (o combinación de columnas).DEFAULT valor: valor que toma la columna cuando un INSERT la omite. Puede ser literal o una función como CURRENT_TIMESTAMP.CHECK (condición): regla booleana que cada fila debe cumplir, p. ej. CHECK (precio > 0). Si falla, el INSERT/UPDATE se rechaza.CREATE TABLE [IF NOT EXISTS] nombre (
col1 TIPO restricciones_de_columna,
col2 TIPO ...,
[restricciones_de_tabla]
);
Las restricciones pueden ir a nivel de columna (junto al tipo) o a nivel de tabla (al final, útil para claves compuestas o CHECK que cruzan columnas).
Tipos en SQLite (afinidad): INTEGER, REAL, TEXT, BLOB, NUMERIC. SQLite es flexible con tipos, pero las restricciones sí se aplican estrictamente.
Detalles importantes:
IF NOT EXISTS hace el CREATE idempotente: no falla si la tabla ya existe. Para reconstruir desde cero, DROP TABLE IF EXISTS antes.PRIMARY KEY compuesta: PRIMARY KEY (a, b) a nivel de tabla.DEFAULT solo actúa cuando la columna se omite en el INSERT; pasar NULL explícito no dispara el default.CHECK puede referirse a varias columnas si se declara a nivel de tabla: CHECK (precio >= costo).SELECT id, nombre, precio, stock FROM productos ORDER BY precio DESC LIMIT 6
-- CREATE idempotente con todas las restricciones
DROP TABLE IF EXISTS productos_nuevos;
CREATE TABLE productos_nuevos (
id INTEGER PRIMARY KEY, -- PK autoincremental
sku TEXT NOT NULL UNIQUE, -- obligatorio y único
nombre TEXT NOT NULL,
precio INTEGER NOT NULL CHECK (precio > 0), -- regla de negocio
costo INTEGER NOT NULL DEFAULT 0, -- valor por defecto
activo INTEGER NOT NULL DEFAULT 1,
CHECK (precio >= costo) -- CHECK a nivel de tabla
);
-- Insertamos: 'costo' y 'activo' usan su DEFAULT
INSERT INTO productos_nuevos (id, sku, nombre, precio) VALUES
(1, 'CRM-100', 'CRM Starter', 1200),
(2, 'ERP-200', 'ERP Básico', 4500);
SELECT * FROM productos_nuevos ORDER BY id;
💡 Define las restricciones en elCREATE TABLE, no en el código de la app: unaCHECK (precio > 0)impide datos corruptos vengan de donde vengan. UsaDROP TABLE IF EXISTS+CREATE TABLEpara scripts re-ejecutables.
| Restricción | Qué garantiza |
|---|---|
PRIMARY KEY | Identificador único por fila (UNIQUE + NOT NULL) |
NOT NULL | La columna nunca queda vacía |
UNIQUE | Sin valores duplicados |
DEFAULT v | Valor al omitir la columna en el INSERT |
CHECK (cond) | Cada fila cumple una regla booleana |
IF NOT EXISTS | No falla si la tabla ya existe (idempotente) |
---
← Eliminar datos: DELETEModificar y borrar estructuras: ALTER, DROP y claves foráneas →