FOREIGN KEY y acciones referenciales
Relacione tablas con FOREIGN KEY y elija ON DELETE CASCADE / SET NULL / RESTRICT según el comportamiento adecuado.
FOREIGN KEY y acciones referenciales es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.
Qué hace una clave foránea
Una FOREIGN KEY hace que la base de datos rechace las filas que apuntan a padres inexistentes:
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id),
total NUMERIC(10,2) NOT NULL
);
-- Inserting an order with user_id=999 fails if no such user exists.¿Por qué usar claves foráneas?
Las claves foráneas garantizan la integridad referencial:
- No hay filas huérfanas
- Detectan los errores de la aplicación en el momento de la inserción
- Hacen que los diagramas ER sean precisos
- Permiten el comportamiento de cascada automático
Acciones referenciales
¿Qué debe ocurrir cuando se elimina o actualiza la fila padre? Hay cinco opciones:
NO ACTION— error (predeterminado, se puede diferir)RESTRICT— error (no se puede diferir)CASCADE— también elimina o actualiza la fila hijaSET NULL— establece la clave foránea de la fila hija en NULLSET DEFAULT— establece la clave foránea de la fila hija en su valor predeterminado
ON DELETE CASCADE
"Cuando se elimine el usuario, elimine también sus pedidos":
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL
REFERENCES users(id) ON DELETE CASCADE,
total NUMERIC(10,2) NOT NULL
);ON DELETE SET NULL
"Cuando se elimine al gerente, los empleados seguirán existiendo, pero perderán a su gerente":
CREATE TABLE employees (
id BIGSERIAL PRIMARY KEY,
full_name TEXT NOT NULL,
manager_id BIGINT REFERENCES employees(id) ON DELETE SET NULL
);Predeterminado: similar a RESTRICT
Sin una acción referencial, intentar eliminar un padre que tiene hijos falla:
ERROR: update or delete on table "users" violates foreign key constraint "orders_user_id_fkey" on table "orders"
DETAIL: Key (id)=(42) is still referenced from table "orders".Indexe siempre la columna de la clave foránea
PostgreSQL NO crea automáticamente un índice en el lado hijo. Añádalo; sin él, eliminar un padre provoca un análisis completo de cada tabla hija:
CREATE INDEX orders_user_id_idx ON orders(user_id);Claves foráneas compuestas
Haga referencia a una clave primaria compuesta:
CREATE TABLE order_items (
order_id BIGINT,
line_no INT,
PRIMARY KEY (order_id, line_no)
);
CREATE TABLE shipments (
order_id BIGINT,
line_no INT,
FOREIGN KEY (order_id, line_no)
REFERENCES order_items(order_id, line_no)
);Posponer las comprobaciones de claves foráneas
A veces necesita insertar un par de tipo huevo y gallina. Marque la clave foránea como DEFERRABLE INITIALLY DEFERRED:
ALTER TABLE orders
ALTER CONSTRAINT orders_user_id_fkey DEFERRABLE INITIALLY DEFERRED;
BEGIN;
INSERT INTO orders ... ; -- FK temporarily not checked
INSERT INTO users ... ;
COMMIT; -- checked hereAñadir claves foráneas en línea
En tablas grandes, use NOT VALID + VALIDATE para evitar un bloqueo prolongado:
ALTER TABLE orders
ADD CONSTRAINT orders_user_id_fkey
FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
ALTER TABLE orders VALIDATE CONSTRAINT orders_user_id_fkey;Use las cascadas con cuidado
Las eliminaciones en CASCADE se propagan. Eliminar un usuario puede borrar pedidos, pagos y registros de auditoría. Asegúrese de que la cascada coincida con la intención de su negocio.
Resumen
Las claves foráneas son barreras de seguridad.
- REFERENCES + acción declara la relación y su comportamiento
- Indexe la columna de la clave foránea en la tabla hija
- Use NOT VALID + VALIDATE para añadirlas en línea
Comprobación rápida
¿Cuál es la acción referencial correcta para ELIMINAR AUTOMÁTICAMENTE un pedido cuando se elimina su usuario padre?
Preguntas frecuentes
¿La lección «FOREIGN KEY y acciones referenciales» es gratis?
Sí — el texto completo de «FOREIGN KEY y acciones referenciales» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué aprenderé en «FOREIGN KEY y acciones referenciales»?
Relacione tablas con FOREIGN KEY y elija ON DELETE CASCADE / SET NULL / RESTRICT según el comportamiento adecuado. Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar SQL Academy?
No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «FOREIGN KEY y acciones referenciales»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de SQL Academy?
Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Restricciones NOT NULL y CHECK
- Restricciones UNIQUE y claves compuestas
- FOREIGN KEY y acciones referenciales
- Valores DEFAULT y columnas generadas