SQLite prend en charge les relations comme n'importe quel autre système de gestion de base de données relationnelle.
SQLite est un relationnel système de gestion de base de données (RDBMS). Il utilise le même modèle relationnel que d'autres SGBD populaires (tels que MySQL, Oracle, SQL Server, MS Access).
Cela signifie que vous pouvez créer plusieurs tables, puis les relier les unes aux autres via une relation .
Une relation est l'endroit où vous avez plusieurs tables qui contiennent des données liées, et les données sont liées par une valeur commune qui est stockée dans les deux tables.
Le schéma suivant illustre ce concept :
Alors, ajoutons une autre table appelée Albums , puis associez-le à nos artistes table via une relation.
Cela nous permettra de rechercher à quel artiste appartient un album donné.
Créer le nouveau tableau
Alors allons-y et créons les Albums tableau :
CREATE TABLE Albums( AlbumId INTEGER PRIMARY KEY, AlbumName TEXT NOT NULL, Year TEXT NOT NULL, ArtistId INTEGER NOT NULL, FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId) );
Similaire à la création des
Artistes
table, cependant, sur celle-ci, nous avons ajouté FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId)
à la fin de la déclaration.
Cela crée une contrainte de clé étrangère sur Albums.ArtistId colonne. Cela signifie que toutes les données insérées dans cette colonne doivent correspondre à une valeur dans Artists.ArtistId colonne.
Si nous ne le faisions pas, il serait possible d'avoir un album qui n'appartient à aucun artiste. En d'autres termes, nous pourrions avoir des enregistrements orphelins dans notre base de données. Pas bon si vous essayez de maintenir l'intégrité référentielle.
Maintenant, si nous lançons un .tables
commande, nous devrions voir les deux tables dans la base de données :
sqlite> .tables Albums Artists
Tester la relation
Une fois que nous avons créé la table avec la clé étrangère, nous pouvons la tester en essayant d'entrer des données erronées. Nous pouvons essayer d'entrer un album avec un ArtistId qui ne correspond pas à un ArtistId dans le tableau référencé (c'est-à-dire les Artistes tableau):
INSERT INTO Albums (AlbumName, Year, ArtistId) VALUES ('Powerslave', '1984', 70);
Cela devrait donner les résultats suivants :
sqlite> INSERT INTO Albums (AlbumName, Year, ArtistId) ...> VALUES ('Powerslave', '1984', 70); Error: FOREIGN KEY constraint failed
Aussi, en exécutant un SELECT
l'instruction sur la table ne renverra aucune donnée.
C'est parce que la contrainte de clé étrangère a empêché l'insertion de la mauvaise valeur.
Ça n'a pas fonctionné ?
Si vous ne recevez pas d'erreur lorsque vous essayez de saisir des données erronées comme celle-ci, vous devrez peut-être vérifier vos paramètres.
Exécutez la commande suivante :PRAGMA foreign_keys;
Si cela donne 0
cela signifie que vos contraintes de clé étrangère sont désactivées. En fait, c'est le comportement par défaut de SQLite (c'est pour la rétrocompatibilité).
Pour activer les contraintes de clé étrangère, saisissez la commande suivante PRAGMA foreign_keys = ON;
Maintenant, en exécutant PRAGMA foreign_keys;
doit renvoyer 1
, et les tentatives ultérieures d'insertion d'une clé étrangère non valide échoueront.
Cependant, si les PRAGMA foreign_keys;
La commande ne renvoie aucune donnée, votre implémentation SQLite ne prend pas en charge les clés étrangères (soit parce qu'elle est antérieure à la version 3.6.19, soit parce qu'elle a été compilée avec SQLITE_OMIT_FOREIGN_KEY
ou SQLITE_OMIT_TRIGGER
défini).
Insérer plus de données
Maintenant que la relation a été établie, nous pouvons ajouter autant de données que nécessaire, avec la certitude que seuls les enregistrements avec des clés étrangères valides seront insérés.
INSERT INTO Albums VALUES (NULL, 'Killers', '1981', 7); INSERT INTO Albums VALUES (NULL, 'Powerslave', '1984', 7); INSERT INTO Albums VALUES (NULL, 'Surfing with the Alien', '1987', 1); INSERT INTO Albums VALUES (NULL, 'Heavy as a Really Heavy Thing', '1995', 11); INSERT INTO Albums VALUES (NULL, 'Yummy Yummy', '1994', 17); INSERT INTO Albums VALUES (NULL, 'Out of the Loop', '2007', 6); INSERT INTO Albums VALUES (NULL, 'Suck on This', '1989', 13); INSERT INTO Albums VALUES (NULL, 'Pork Soda', '1993', 13); INSERT INTO Albums VALUES (NULL, 'Sailing the Seas of Cheese', '1991', 13); INSERT INTO Albums VALUES (NULL, 'Flying in a Blue Dream', '1989', 1); INSERT INTO Albums VALUES (NULL, 'Black Swans and Wormhole Wizards', '2010', 1); INSERT INTO Albums VALUES (NULL, 'Somewhere in Time', '1986', 7); INSERT INTO Albums VALUES (NULL, 'Big Red Car', '1995', 17);
Ensuite, nous sélectionnerons les données des deux tables à l'aide d'un JOIN
déclaration.