Trabajando con restricciones de clave externa (Foreign Key Constraints)
En este último paso, exploraremos cómo las restricciones de clave externa (foreign key constraints) ayudan a mantener la integridad de los datos entre tablas relacionadas. Las restricciones de clave externa garantizan que las relaciones entre tablas sigan siendo válidas al evitar operaciones que crearían registros huérfanos o datos inconsistentes.
Intentemos entender cómo funcionan las restricciones de clave externa a través de algunos ejemplos:
Primero, intentemos agregar un libro con un author_id
no válido:
-- Esto fallará debido a la restricción de clave externa
INSERT INTO books (title, author_id, publisher_id, publication_year, price)
VALUES ('Failed Book', 999, 1, 2023, 29.99);
Verás un mensaje de error porque el author_id
999 no existe en la tabla authors
:
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`bookstore`.`books`, CONSTRAINT `books_ibfk_1` FOREIGN KEY (`author_id`) REFERENCES `authors` (`author_id`))
Este mensaje de error indica que la restricción de clave externa en la columna author_id
de la tabla books
nos impide agregar un libro que hace referencia a un author_id
que no existe en la tabla authors
.
Del mismo modo, no podemos eliminar un autor que ha publicado libros sin manejar primero sus libros:
-- Esto fallará debido a la restricción de clave externa
DELETE FROM authors WHERE author_id = 1;
Intentar eliminar directamente al autor con author_id = 1
resulta en un error de clave externa porque hay libros que hacen referencia a ese author_id
. Esta es la forma en que MySQL asegura que tus datos permanezcan consistentes.
Para eliminar de forma segura un autor y sus libros, necesitamos hacer lo siguiente:
- Eliminar primero los libros y luego al autor. Esto asegura que no tengamos registros huérfanos.
- Usar
CASCADE DELETE
(lo exploraremos en laboratorios avanzados).
Veamos cómo eliminar adecuadamente un libro y su autor eliminando primero el libro:
-- Primero, eliminamos los libros de este autor
DELETE FROM books WHERE author_id = 1;
-- Ahora podemos eliminar al autor de forma segura
DELETE FROM authors WHERE author_id = 1;
Al eliminar primero el/los libro(s), estás eliminando las referencias de clave externa, lo que permite eliminar al autor sin violar las restricciones.