Ir al contenido
wannacode

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:

SQLbase de datos 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

  • PKidinteger
  • nametext
  • citytext
  • phonetext
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).

SQLbase de datos vacía

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ó:

SQLbase de datos vacía

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:

SQLbase de datos vacía

Ahora «doce» no entra. Un texto que es un número se sigue aceptando y se convierte:

SQLbase de datos vacía
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.

SQLbase de datos vacía

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.
  • DATE y TIMESTAMP: una fecha, y una fecha con hora.
  • BOOLEAN: verdadero o falso.

SQLite acepta estos nombres, pero no los hace cumplir:

SQLbase de datos vacía

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.

SQLbase de datos: tienda

Test

Ponte a prueba

1. ¿Qué tipo le va a un precio como 2,50 €?
2. La tabla no es STRICT, y la columna counted es INTEGER. ¿Qué pasa cuando insertas el texto «doce»?
3. ¿Cómo se guardan las fechas en SQLite?
4. ¿Qué hace STRICT al final de CREATE TABLE?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·