Ce que garantit une clef étrangère
Exercice d'entraînement · niveau 2 · mathématiques appliquées (ECG 2e année), chapitre 13 — Bases de données et travaux pratiques · Modèle relationnel et schéma
Énoncé
Une bibliothèque gère une table lecteur, de champs id (entier) et nom (texte). Écrire le schéma d'une table emprunt comportant un identifiant entier en clef primaire, l'identifiant entier du lecteur en clef étrangère vers lecteur, et un titre en texte. Dire ensuite ce qui se passe si l'on tente d'insérer un emprunt dont le lecteur n'existe pas.
Corrigé
Le schéma.
CREATE TABLE emprunt (
id INTEGER PRIMARY KEY,
lecteur_id INTEGER,
titre TEXT,
FOREIGN KEY (lecteur_id) REFERENCES lecteur(id)
);
Trois points de syntaxe. Les deux seuls domaines du programme sont INTEGER et TEXT. Le champ lecteur_id est déclaré comme un champ ordinaire, de type entier ; la ligne FOREIGN KEY ne crée pas une colonne supplémentaire, elle déclare le lien. Et ce lien pointe vers la clef primaire de l'autre table, écrite lecteur(id).
L'insertion fautive. Supposons que la table lecteur ne contienne que les identifiants et , et que l'on tente
INSERT INTO emprunt VALUES (7, 99, 'Germinal');
Aucun lecteur ne porte l'identifiant . La contrainte de clef étrangère est violée, et le système refuse l'insertion : la ligne n'entre pas dans la base.
C'est le but de la contrainte. Sans elle, la ligne serait acceptée et l'on obtiendrait un emprunt orphelin, rattaché à un lecteur inexistant. La base resterait techniquement valide, mais elle mentirait : une jointure interne laisserait cet emprunt de côté sans le signaler, et l'on conclurait à tort que l'emprunt n'existe pas.
Le point à retenir. La clef étrangère est une garantie de cohérence : elle interdit de créer un lien vers rien. C'est aussi elle que suivra plus tard la jointure INNER JOIN emprunt ON emprunt.lecteur_id = lecteur.id.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.