CREATE TABLE: crear una tabla
En resumen: CREATE TABLE crea una tabla con columnas y tipos; en SQLite los tipos son solo un deseo, STRICT los convierte en reglas.
Problema
La libreta de los proveedores
El pan viene de una panadería, la leche de una lechería, los productos de limpieza de un almacén mayorista. Sus teléfonos están en una libreta junto a la caja. Si la libreta se pierde, nadie sabe a quién llamar.
Deben estar en la base de datos. Hasta ahora las tablas ya estaban hechas. Esta la harás tú.
La idea
CREATE TABLE
CREATE TABLE crea una tabla nueva: un nombre y, entre paréntesis, las columnas, cada una con un tipo. La base de datos de aquí está vacía:
La columna id INTEGER PRIMARY KEY es la clave primaria. En SQLite una columna así recibe el número siguiente por sí sola, por eso no está en el INSERT. Las columnas se separan con comas, y después de la última no va coma.
Esta es la tabla nueva:
suppliers
- PK
idinteger nametextcitytextphonetext
Más precisamente, para curiosos
Una tabla que ya existe no se puede crear por segunda vez: SQLite se detiene con «table suppliers already exists». CREATE TABLE IF NOT EXISTS suppliers (…) la crea solo si no existe. Es útil en un script que se ejecuta más de una vez.
La idea
Los tipos
El tipo dice qué valores tendrá la columna. SQLite tiene cinco:
INTEGER: un número entero. Existencias, una cantidad, un número.REAL: un número decimal. Un precio, un peso.TEXT: texto. Un nombre, una ciudad, un número de teléfono.BLOB: bytes tal cual. Una foto, un archivo.NUMERIC: un número que SQLite guarda como entero si puede, y si no, como decimal.
No hay un tipo aparte para las fechas. Las fechas de la tienda son texto con la forma '2026-10-25': así se ordenan bien. Un número de teléfono también es texto, aunque esté hecho de dígitos: no se calcula con él, y un cero inicial tiene que quedarse.
Más precisamente, para curiosos
REAL es un número de coma flotante. La mayoría de los decimales los guarda de forma aproximada, no exacta, y los errores pequeños se acumulan en muchos cálculos. Por eso los proyectos reales suelen guardar el dinero en céntimos como INTEGER (250 en lugar de 2,50) o con el tipo NUMERIC(10,2) en PostgreSQL y MySQL. En la tienda los precios son REAL, para que se lean como en un ticket.
Pruébalo
Las entregas
Crea una tabla deliveries para las entregas: id (clave primaria), supplier_id (el número del proveedor, un número entero), delivered_at (la fecha) y amount (el importe en euros, un número decimal como los precios de la tienda).
Solución
CREATE TABLE deliveries (
id INTEGER PRIMARY KEY,
supplier_id INTEGER,
delivered_at TEXT,
amount REAL
);id INTEGER PRIMARY KEY, supplier_id INTEGER, delivered_at TEXT, amount REAL. La fecha es texto, porque SQLite no tiene un tipo de fecha. El importe es REAL, porque tiene céntimos.
Míralo
Texto en una columna numérica
El almacenero cuenta los productos y anota cuántos hay. Un día escribe «doce» con letras. Ejecuta la consulta. typeof() te dice el tipo del valor que realmente se guardó:
Las dos filas entran. '12' se convierte en el número 12, porque la columna es INTEGER y SQLite puede convertirlo. «doce» no puede ser un número y se queda como texto en la columna numérica.
Esto es la afinidad de tipos (type affinity) de SQLite. El tipo de la columna es más bien una recomendación: SQLite intenta convertir el valor, pero si no puede, lo toma como está. El informe SUM(counted) contará entonces «doce» en silencio como 0.
La idea
STRICT
Si escribes STRICT después de los paréntesis de CREATE TABLE, los tipos pasan a ser reglas:
Ahora «doce» no entra. Un texto que es un número se sigue aceptando y se convierte:
Más precisamente, para curiosos
En una tabla STRICT cada columna debe tener un tipo, y debe ser uno de INTEGER (o INT), REAL, TEXT, BLOB y ANY. ANY acepta cualquier cosa sin convertirla. NUMERIC no se permite allí. Las tablas STRICT existen en SQLite desde la versión 3.37 (2021). El curso funciona con SQLite 3.49.
Pruébalo
El recuento estricto de existencias
La tabla del recuento de existencias tiene un producto (product, texto), la cantidad contada (counted, un número entero) y una fecha (counted_at). Haz que las palabras en lugar de números no entren.
Solución
CREATE TABLE stock_counts (
product TEXT,
counted INTEGER,
counted_at TEXT
) STRICT;Añades STRICT después del paréntesis de cierre: ) STRICT;. Las columnas se quedan igual.
La idea
En PostgreSQL y MySQL
Las bases de datos grandes tienen más tipos. Los encontrarás en casi todos los esquemas:
VARCHAR(50): texto de hasta 50 caracteres.NUMERIC(10,2): un número exacto con 2 dígitos tras la coma. Para dinero.DATEyTIMESTAMP: una fecha, y una fecha con hora.BOOLEAN: verdadero o falso.
SQLite acepta estos nombres, pero no los hace cumplir:
El código tiene más de 5 caracteres, «sí» no es un booleano, «hasta Navidad» no es una fecha. SQLite los guarda como texto. PostgreSQL rechazaría los tres. Cuando escribas un esquema para otra base de datos, usa sus tipos. Cuando lo pruebes en SQLite, no cuentes con que protejan los datos.
Ejercicio
Los proveedores en la tienda
Junto a las tablas de la tienda, crea suppliers con id (clave primaria), name y city. Añade dos proveedores: «Panadería Zora» de Sofía y «Lácteos Balkan» de Smolyan.
Solución
CREATE TABLE suppliers (
id INTEGER PRIMARY KEY,
name TEXT,
city TEXT
);
INSERT INTO suppliers (name, city) VALUES ('Panadería Zora', 'Sofía'), ('Lácteos Balkan', 'Smolyan');CREATE TABLE suppliers (id INTEGER PRIMARY KEY, name TEXT, city TEXT); y luego un INSERT con dos filas. Los números 1 y 2 vienen solos de la clave primaria.
Test
Ponte a prueba
Lecciones relacionadas
Sección «Lecciones relacionadas»- Se basa en: SELECT: elegir columnas · Funciones de agregación: COUNT, SUM, AVG · Clave primaria y clave foránea · INSERT: insertar filas
- Continúa en: Restricciones: reglas para los datos · Claves foráneas: vínculos entre tablas · ALTER TABLE: cambiar una tabla · Vistas
- Ejercicios sobre el tema: Tablas y reglas