Llaves: identificar y conectar.
Una llave primaria (PK) responde a “¿cuál fila es esta?”. Una llave foránea (FK) responde a “¿con cuál fila de otra tabla está relacionada esta?”. Solo dos ideas, pero sostienen todo el modelo.
01Primary Key
Una PK es una columna (o combinación) que identifica unívocamente cada fila. El motor te garantiza dos cosas:
- No se repite el valor entre filas.
- No es
NULL.
CREATE TABLE usuarios ( id INT PRIMARY KEY AUTO_INCREMENT, email VARCHAR(120) UNIQUE NOT NULL, nombre VARCHAR(80) );
El email también es único, pero la PK ideal suele ser un id sintético (un número o UUID) — los emails cambian, los IDs no.
02Foreign Key — el “puente”
Una FK es una columna en la tabla A que apunta a la PK de la tabla B. El motor verifica que el valor exista realmente del otro lado: integridad referencial.
CREATE TABLE pedidos ( id INT PRIMARY KEY AUTO_INCREMENT, usuario_id INT NOT NULL REFERENCES usuarios(id), total DECIMAL(10,2), creado_en TIMESTAMP );
Sin FK, alguien puede insertar un pedido con usuario_id = 9999 que no existe. Tres meses después, un reporte que “suma pedidos por usuario” ignora silenciosamente esos huérfanos. La FK lo bloquea desde el primer INSERT.
03Laboratorio · armar la relación
El siguiente lab crea dos tablas conectadas. Intenta insertar un pedido con un usuario_id que no existe — el motor te corregirá.
CREATE TABLE usuarios ( id INT PRIMARY KEY AUTO_INCREMENT, nombre VARCHAR(60), email VARCHAR(120) UNIQUE ); CREATE TABLE pedidos ( id INT PRIMARY KEY AUTO_INCREMENT, usuario_id INT NOT NULL REFERENCES usuarios(id), total DECIMAL(10,2) ); INSERT INTO usuarios (nombre, email) VALUES ('Ana', '[email protected]'), ('Luis', '[email protected]'); INSERT INTO pedidos (usuario_id, total) VALUES (1, 45000), (2, 18000), (1, 23000);
CREATE TABLE con REFERENCES y mira el diagrama.04Cardinalidad — cuántas con cuántas
producto_categoria(producto_id, categoria_id).05Desafíos · ponete a prueba
Tres retos sobre llaves primarias y foráneas, de menor a mayor dificultad. Escribí tu consulta y dale Comprobar.
Registrá un nuevo pedido de Luis (usuario con id 2) por un total de 75 000. Insertá la fila en la tabla pedidos respetando la llave foránea.
Mostrá el nombre del usuario y el total de cada pedido uniendo las dos tablas por la llave. Mostrá las columnas nombre y total.
Calculá cuánto gastó en total cada usuario. Mostrá nombre y total_gastado, ordenados del que más gastó al que menos.