FOREIGN KEY
Une clé étrangère garantit qu'une valeur pointe vers une ligne qui existe dans une autre table, comme l'élève d'une absence. Elle empêche les références orphelines et encadre les suppressions.
- clé étrangère
- référence
- intégrité
- ON DELETE
- CASCADE
- PRAGMA foreign_keys
Syntaxe
col INTEGER REFERENCES table_parent(id) [ON DELETE CASCADE | SET NULL | RESTRICT] [ON UPDATE ...]Exemple
PRAGMA foreign_keys = ON;CREATE TABLE absences ( id INTEGER PRIMARY KEY, student_id INTEGER NOT NULL REFERENCES students(id) ON DELETE CASCADE, absent_on TEXT NOT NULL);INSERT INTO absences (student_id, absent_on) VALUES (2, '2024-10-03');INSERT INTO absences (student_id, absent_on) VALUES (99, '2024-10-04');-- Jeu de données : école-- La première absence est acceptée. La seconde vise un élève 99 qui n'existe pas.-- Résultat attendu : erreur « FOREIGN KEY constraint failed »À retenir
- Piège : SQLite ne vérifie les clés étrangères qu'après PRAGMA foreign_keys = ON, à exécuter à chaque connexion et hors transaction. Sans cette ligne, l'insertion de l'élève 99 passe sans erreur.
- Actions ON DELETE : CASCADE supprime les lignes enfants, SET NULL vide la référence, RESTRICT ou NO ACTION (par défaut) refusent la suppression du parent.
- Une clé étrangère peut être NULL : c'est une relation facultative, comme une classe sans professeur. Ajoutez NOT NULL si la relation est obligatoire.
- La clé étrangère n'est pas indexée automatiquement. Créez un index sur student_id pour accélérer les jointures et les vérifications lors des suppressions.
Voir aussi
- PRIMARY KEYLa clé primaire identifie chaque ligne de façon unique et stable : jamais deux fois la même valeur, jamais NULL. C'est elle que référencent les clés étrangères des autres tables.
- INNER JOININNER JOIN associe les lignes de deux tables qui se correspondent, en général une clé étrangère et la clé primaire qu'elle référence. Les lignes sans correspondance disparaissent du résultat.
- DELETEDELETE retire des lignes d'une table tout en conservant sa structure. On l'utilise pour purger des données obsolètes ou annulées, toujours avec un WHERE vérifié au préalable.
- CREATE INDEXUn index est une structure triée, comme l'index d'un livre, qui permet de trouver des lignes sans parcourir toute la table. Il accélère lectures et jointures mais ralentit un peu les écritures.