Travailler avec les contraintes de clé étrangère (Foreign Key Constraints)
Dans cette étape finale, nous explorerons comment les contraintes de clé étrangère (foreign key constraints) contribuent à maintenir l'intégrité des données entre les tables liées. Les contraintes de clé étrangère garantissent que les relations entre les tables restent valides en empêchant les opérations qui créeraient des enregistrements orphelins ou des données incohérentes.
Comprenons comment fonctionnent les contraintes de clé étrangère grâce à quelques exemples :
Tout d'abord, essayons d'ajouter un livre avec un author_id
invalide :
-- Cette requête échouera en raison de la contrainte de clé étrangère
INSERT INTO books (title, author_id, publisher_id, publication_year, price)
VALUES ('Failed Book', 999, 1, 2023, 29.99);
Vous verrez un message d'erreur car l'author_id
999 n'existe pas dans la table 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`))
Ce message d'erreur indique que la contrainte de clé étrangère sur la colonne author_id
dans la table books
nous empêche d'ajouter un livre qui fait référence à un author_id
qui n'existe pas dans la table authors
.
De même, nous ne pouvons pas supprimer un auteur qui a publié des livres sans traiter d'abord ses livres :
-- Cette requête échouera en raison de la contrainte de clé étrangère
DELETE FROM authors WHERE author_id = 1;
Tenter de supprimer directement l'auteur avec author_id = 1
entraîne une erreur de clé étrangère car il existe des livres qui font référence à cet author_id
. C'est ainsi que MySQL s'assure que vos données restent cohérentes.
Pour supprimer en toute sécurité un auteur et ses livres, nous devons soit :
- Supprimer d'abord les livres, puis l'auteur. Cela garantit que nous n'aurons pas d'enregistrements orphelins.
- Utiliser
CASCADE DELETE
(que nous explorerons dans les laboratoires avancés).
Voyons comment supprimer correctement un livre et son auteur en supprimant d'abord le livre :
-- Tout d'abord, supprimez les livres de cet auteur
DELETE FROM books WHERE author_id = 1;
-- Maintenant, nous pouvons supprimer en toute sécurité l'auteur
DELETE FROM authors WHERE author_id = 1;
En supprimant d'abord le(s) livre(s), vous supprimez les références de clé étrangère, permettant ainsi de supprimer l'auteur sans violer les contraintes.