Saltar al contenido

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
);
Lo que rompe sin FK

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á.

~/sql-labpostgres · in-memory
query.sql
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);
listo
Aún no hay tablas. Escribe CREATE TABLE con REFERENCES y mira el diagrama.

04Cardinalidad — cuántas con cuántas

1·1
Uno a uno
Cada usuario tiene exactamente un perfil y viceversa. Se modela poniendo la FK en cualquiera de las dos.
1·N
Uno a muchos
Un usuario tiene muchos pedidos. La FK vive en la tabla del lado “muchos”.
N·N
Muchos a muchos
Productos en muchas categorías y categorías con muchos productos. Se resuelve con una tabla puente: 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.

Básico

Mostrá el nombre del usuario y el total de cada pedido uniendo las dos tablas por la llave. Mostrá las columnas nombre y total.

Intermedio

Calculá cuánto gastó en total cada usuario. Mostrá nombre y total_gastado, ordenados del que más gastó al que menos.

Avanzado