Crear tablas y procedimientos almacenados
Once módulos preguntando y modificando datos en tablas que ya existían. Hoy levantas el capó: así es exactamente como se construyen esas tablas desde cero —las mismas tres que has usado en todo el curso—, y conoces una pieza que vive fuera del propio SQL estándar: los procedimientos almacenados.
De dónde salió la base de datos de este curso
Todo este tiempo has consultado clientes,
productos y pedidos como
si ya existieran por arte de magia. En realidad, cada playground las crea con
exactamente esta sentencia antes de que escribas tu primera consulta:
Define una tabla nueva: su nombre y, entre paréntesis, cada columna con su tipo de dato.
Marca la columna que identifica a cada fila de forma única. No puede repetirse ni estar vacía. En SQLite, una PRIMARY KEY de tipo INTEGER se autoincrementa sola.
Elimina una tabla entera, con todo su contenido. No pide confirmación — la contraparte de CREATE TABLE, y otro candidato a "comando peligroso" de este curso.
Modifica una tabla que ya existe: añadir una columna, por ejemplo, con ALTER TABLE productos ADD COLUMN descuento REAL;
FOREIGN KEY: la relación entre tablas, hecha explícita
Ya usabas cliente_id para relacionar pedidos con
clientes en tus JOIN — pero eso, por sí solo, es solo un número. Una
FOREIGN KEY (clave foránea) le dice a la base de
datos: "este número tiene que corresponder de verdad a un id que exista en la
otra tabla", y se lo hace cumplir por ti.
Más restricciones habituales
Obliga a que la columna siempre tenga un valor — no se permite dejarla vacía (NULL) al insertar.
No permite valores repetidos en esa columna, aunque no sea la clave primaria (por ejemplo, dos clientes no deberían compartir email).
Un valor que se usa automáticamente si no especificas ninguno al insertar. DEFAULT 0 en stock, por ejemplo.
Una condición que cada fila debe cumplir siempre. CHECK (precio > 0) impide precios negativos por diseño, no por disciplina del programador.
Cuantas más reglas dejes que imponga la propia base de datos (NOT NULL, UNIQUE, CHECK, FOREIGN KEY...), menos bugs de datos corruptos vas a perseguir más adelante en el código de la aplicación. Es mucho más fácil prevenir un dato mal formado en el origen que limpiarlo después.
Procedimientos almacenados
Un procedimiento almacenado es un bloque de SQL con nombre, guardado dentro de la propia base de datos, que puedes ejecutar tantas veces como quieras llamándolo por su nombre — como una función, pero viviendo en el servidor de base de datos en vez de en tu código de aplicación.
Si pulsas "Ejecutar" verás un error — y es intencionado. SQLite (el motor que corre en tu navegador para este curso) no soporta procedimientos almacenados; es una extensión propia de MySQL, PostgreSQL o SQL Server, no del estándar SQL que has aprendido hasta ahora. Aun así, mereces reconocer la sintaxis si te la encuentras: te evita el "¿esto qué es?" el primer día en un trabajo nuevo.
Ponlo a prueba
Comprueba lo que has aprendido
1. ¿Para qué sirve una FOREIGN KEY?
2. ¿Qué hace la restricción CHECK (precio > 0)?
3. ¿Por qué el playground de este módulo no puede ejecutar CREATE PROCEDURE?