Versions plus récentes de SQLite support des contraintes de clés étrangères . Il est possible de définir
CREATE TABLE MASTER (_ID INTEGER PRIMARY KEY, ...);
CREATE TABLE SERVANT (_ID INTEGER PRIMARY KEY, MASTERID INTEGER,
FOREIGN KEY(MASTERID) REFERENCES MASTER(_ID);
Selon la documentation, par défaut, "NO ACTION" est utilisé pour ON DELETE et ON UPDATE. Mais contrairement à d'autres DBS, "NO ACTION" ne semble pas signifier que la suppression ou la mise à jour n'est pas effectuée. Cela semble signifier que rien n'est fait pour préserver l'intégrité, du moins d'après mes tests(*) et si je comprends l'objectif de l'opération. documentation droite :
Configurer "NO ACTION" signifie exactement cela : lorsqu'une clé parent est modifiée ou supprimée de la base de données, aucune action particulière n'est entreprise.
Ainsi,
INSERT INTO MASTER (_ID) VALUES (1);
INSERT INTO SERVANT (_ID, MASTERID) VALUES (1,1);
DELETE FROM MASTER;
me donne une table MASTER vide et une table SERVANT avec une clé étrangère qui ne mène nulle part.
Quelqu'un peut-il confirmer ce comportement et peut-être expliquer pourquoi il est mis en œuvre de cette façon ? Ou dois-je configurer quelque chose pour que le support des clés étrangères fonctionne ? Je suis nouveau dans le développement de SQLite, alors pardonnez-moi si cette question est stupide.
Editar: (*) mes tests étaient défectueux, cf. ma réponse ci-dessous .