17.Les contraintes d'intégrité

17.2.Principe de fonctionnement

Pour palier au problème soulevé par l'exemple précédent, lors de la création de la table (ou ultérieurement par modification de la table) il convient d'indiquer que le champ realisateur_id de la table film fait référence au champ id de la table realisateurs. Le champ realisateur_id est donc ce que l'on appelle une clé étrangère (foreign key). Lorsqu'une contrainte d'intégrité est déclarée alors toute tentative d'insérer une valeur incorrecte (dans le champ foreign key) générera une erreur obligeant la création de l'enregistrement correspondant dans la table liée (ici, la table realisateurs) ou bien obligeant la modification de la valeur du champ (ici realisateur_id).

17.3.Conséquences principales

Dans le cas de tables contenant
Films
id titre realisateur_id
1 Forrest Gump 2
Realisateurs
id nom prenom
1 Boon Dany
2 Zemeckis Robert
Il sera alors tout à fait possible d'exécuter la requête suivante:
INSERT INTO films (id, titre, realisateur_id) VALUES (2, 'Bienvenue chez les ch''tis', 1);
Puisque le réalisateur "Dany Boon" est un enregistrement connu dans la table des réalisateurs.
En revanche, la requête
INSERT INTO films (id, titre, realisateur_id) VALUES (2, 'Titanic', 3);
ne sera pas valable tant que l'enregistrement avec un id=3 ne sera pas créé. Et toute tentative d'exécution d'une telle requête levera une erreur.
Ainsi, sous MySQL cela aura pour conséquence la remonté d'un message d'erreur genre ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test/films`, CONSTRAINT `films_ibfk_1` FOREIGN KEY (`realisateur_id`) REFERENCES `realisateurs` (`id`))
A l'inverse, si l'on souhaite supprimer de la table realisateurs, l'enregistrement 2 (qui est lié à l'enregistrement 1 de la table films) alors nous aurons également un cas d'erreur.
Ce qui se traduira, sous MySQL par le message d'erreur suivant ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test/films`, CONSTRAINT `films_ibfk_1` FOREIGN KEY (`realisateur_id`) REFERENCES `realisateurs` (`id`))