Résumé :dans ce didacticiel, vous apprendrez à utiliser la contrainte de clé étrangère SQLite pour renforcer les relations entre les tables associées.
Prise en charge des contraintes de clé étrangère SQLite
SQLite prend en charge la contrainte de clé étrangère depuis la version 3.6.19. La bibliothèque SQLite doit également être compilée avec ni SQLITE_OMIT_FOREIGN_KEY ni SQLITE_OMIT_TRIGGER.
Pour vérifier si votre version actuelle de SQLite prend en charge les contraintes de clé étrangère ou non, vous utilisez la commande suivante.
PRAGMA foreign_keys;
Code language: SQL (Structured Query Language) (sql)
La commande renvoie une valeur entière :1 :activer, 0 :désactivé. Si la commande ne renvoie rien, cela signifie que votre version de SQLite ne prend pas en charge les contraintes de clé étrangère.
Si la bibliothèque SQLite est compilée avec le support des contraintes de clé étrangère, l'application peut utiliser les PRAGMA foreign_keys
commande pour activer ou désactiver les contraintes de clé étrangère lors de l'exécution.
Pour désactiver la contrainte de clé étrangère :
PRAGMA foreign_keys = OFF;
Code language: SQL (Structured Query Language) (sql)
Pour activer la contrainte de clé étrangère :
PRAGMA foreign_keys = ON;
Code language: SQL (Structured Query Language) (sql)
Introduction aux contraintes de clé étrangère SQLite
Commençons par deux tableaux :suppliers
et suplier_groups
:
CREATE TABLE suppliers (
supplier_id integer PRIMARY KEY,
supplier_name text NOT NULL,
group_id integer NOT NULL
);
CREATE TABLE supplier_groups (
group_id integer PRIMARY KEY,
group_name text NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
En supposant que chaque fournisseur appartient à un et un seul groupe de fournisseurs. Et chaque groupe de fournisseurs peut avoir zéro ou plusieurs fournisseurs. La relation entre suplier_groups
et suppliers
tables est un-à-plusieurs. Autrement dit, pour chaque ligne du champ suppliers
table, il y a une ligne correspondante dans le suplier_groups
tableau.
Actuellement, il n'y a aucun moyen de vous empêcher d'ajouter une ligne aux suppliers
table sans ligne correspondante dans les suplier_groups
tableau.
De plus, vous pouvez supprimer une ligne dans les suplier_groups
tableau sans supprimer ni mettre à jour les lignes correspondantes dans le suppliers
table. Cela peut laisser des lignes orphelines dans les suppliers
tableau.
Pour appliquer la relation entre les lignes dans le suppliers
et suplier_groups
table, vous utilisez les contraintes de clé étrangère .
Pour ajouter la contrainte de clé étrangère aux suppliers
table, vous modifiez la définition de la CREATE TABLE
déclaration ci-dessus comme suit :
DROP TABLE suppliers;
CREATE TABLE suppliers (
supplier_id INTEGER PRIMARY KEY,
supplier_name TEXT NOT NULL,
group_id INTEGER NOT NULL,
FOREIGN KEY (group_id)
REFERENCES supplier_groups (group_id)
);
Code language: SQL (Structured Query Language) (sql)
Les suplier_groups
la table est appelée table parent , qui est la table à laquelle une clé étrangère fait référence. Les suppliers
la table est appelée table enfant , qui est la table à laquelle s'applique la contrainte de clé étrangère.
Le group_id
colonne dans le suplier_groups
la table est appelée clé parent , qui est une colonne ou un ensemble de colonnes de la table parent à laquelle la contrainte de clé étrangère fait référence. En règle générale, la clé parent est la clé primaire de la table parent.
Le group_id
colonne dans la colonne suppliers
table est appelée la clé enfant. Généralement, la clé enfant fait référence à la clé primaire de la table parent.
Exemple de contrainte de clé étrangère SQLite
Tout d'abord, insérez trois lignes dans les suplier_groups
tableau.
INSERT INTO supplier_groups (group_name)
VALUES
('Domestic'),
('Global'),
('One-Time');
Code language: SQL (Structured Query Language) (sql)
Ensuite, insérez un nouveau fournisseur dans le champ suppliers
table avec le groupe de fournisseurs qui existe dans le suplier_groups
tableau.
INSERT INTO suppliers (supplier_name, group_id)
VALUES ('HP', 2);
Code language: SQL (Structured Query Language) (sql)
Cette instruction fonctionne parfaitement bien.
Troisièmement, essayez d'insérer un nouveau fournisseur dans les suppliers
table avec le groupe fournisseur qui n'existe pas dans le suplier_groups
tableau.
INSERT INTO suppliers (supplier_name, group_id)
VALUES('ABC Inc.', 4);
Code language: SQL (Structured Query Language) (sql)
SQLite a vérifié la contrainte de clé étrangère, a rejeté la modification et a émis le message d'erreur suivant :
[SQLITE_CONSTRAINT] Abort due to constraint violation (FOREIGN KEY constraint failed)
Code language: CSS (css)
Actions de contrainte de clé étrangère SQLite
Que se passerait-il si vous supprimiez une ligne dans les suplier_groups
table? Si toutes les lignes correspondantes dans les suppliers
table sont également supprimés ? Les mêmes questions à l'opération de mise à jour.
Pour spécifier le comportement de la contrainte de clé étrangère chaque fois que la clé parent est supprimée ou mise à jour, vous utilisez le ON DELETE
ou ON UPDATE
comme suit :
FOREIGN KEY (foreign_key_columns)
REFERENCES parent_table(parent_key_columns)
ON UPDATE action
ON DELETE action;
Code language: SQL (Structured Query Language) (sql)
SQLite prend en charge les actions suivantes :
- FIXER NULL
- RÉGLER PAR DÉFAUT
- RESTREINDRE
- AUCUNE ACTION
- CASCADE
En pratique, les valeurs de la clé primaire dans la table parent ne changent pas donc les règles de mise à jour sont moins importantes. La règle la plus importante est le DELETE
règle qui spécifie l'action lorsque la clé parent est supprimée.
Nous allons examiner chaque action par l'exemple suivant
MISE NULLE
Lorsque la clé parent change, est supprimée ou mise à jour, les clés enfants correspondantes de toutes les lignes de la table enfant sont définies sur NULL.
Tout d'abord, déposez et créez la table suppliers
en utilisant le SET NULL
action pour le group_id
clé étrangère :
DROP TABLE suppliers;
CREATE TABLE suppliers (
supplier_id INTEGER PRIMARY KEY,
supplier_name TEXT NOT NULL,
group_id INTEGER,
FOREIGN KEY (group_id)
REFERENCES supplier_groups (group_id)
ON UPDATE SET NULL
ON DELETE SET NULL
);
Code language: SQL (Structured Query Language) (sql)
Deuxièmement, insérez quelques lignes dans les suppliers
tableau :
INSERT INTO suppliers (supplier_name, group_id)
VALUES('XYZ Corp', 3);
INSERT INTO suppliers (supplier_name, group_id)
VALUES('ABC Corp', 3);
Code language: SQL (Structured Query Language) (sql)
Troisièmement, supprimez l'ID de groupe de fournisseurs 3 de suplier_groups
tableau :
DELETE FROM supplier_groups
WHERE group_id = 3;
Code language: SQL (Structured Query Language) (sql)
Quatrièmement, interrogez les données des suppliers
tableau.
SELECT * FROM suppliers;
Code language: SQL (Structured Query Language) (sql)
Les valeurs du group_id
colonne des lignes correspondantes dans le suppliers
table définie sur NULL.
RÉGLER PAR DÉFAUT
Le SET DEFAULT
définit la valeur de la clé étrangère sur la valeur par défaut spécifiée dans la définition de la colonne lorsque vous créez la table.
Parce que les valeurs de la colonne group_id
par défaut à NULL, si vous supprimez une ligne de suplier_groups
table, les valeurs du group_id
sera défini sur NULL.
Après avoir attribué la valeur par défaut, la contrainte de clé étrangère entre en jeu et porte le contrôle.
RESTREINDRE
Le RESTRICT
l'action ne vous permet pas de modifier ou de supprimer des valeurs dans la clé parent de la table parent.
Tout d'abord, déposez et créez les suppliers
table avec le RESTRICT
action dans la clé étrangère group_id
:
DROP TABLE suppliers;
CREATE TABLE suppliers (
supplier_id INTEGER PRIMARY KEY,
supplier_name TEXT NOT NULL,
group_id INTEGER,
FOREIGN KEY (group_id)
REFERENCES supplier_groups (group_id)
ON UPDATE RESTRICT
ON DELETE RESTRICT
);
Code language: SQL (Structured Query Language) (sql)
Deuxièmement, insérez une ligne dans la table suppliers
avec le group_id 1.
INSERT INTO suppliers (supplier_name, group_id)
VALUES('XYZ Corp', 1);
Code language: SQL (Structured Query Language) (sql)
Troisièmement, supprimez le groupe de fournisseurs avec l'identifiant 1 du suplier_groups
tableau :
DELETE FROM supplier_groups
WHERE group_id = 1;
Code language: SQL (Structured Query Language) (sql)
SQLite a émis l'erreur suivante :
[SQLITE_CONSTRAINT] Abort due to constraint violation (FOREIGN KEY constraint failed)
Code language: CSS (css)
Pour résoudre ce problème, vous devez d'abord supprimer toutes les lignes des suppliers
table qui a group_id
1 :
DELETE FROM suppliers
WHERE group_id =1;
Code language: SQL (Structured Query Language) (sql)
Ensuite, vous pouvez supprimer le groupe de fournisseurs 1 du suplier_groups
tableau :
DELETE FROM supplier_groups
WHERE group_id = 1;
Code language: SQL (Structured Query Language) (sql)
AUCUNE ACTION
Le NO ACTION
ne signifie pas contourner la contrainte de clé étrangère. Il a le même effet que le RESTRICT
.
CASCADE
La CASCADE
l'action propage les modifications de la table parent à la table enfant lorsque vous mettez à jour ou supprimez la clé parent.
Insérez d'abord le supplier
groupes dans les suplier_groups
tableau :
INSERT INTO supplier_groups (group_name)
VALUES
('Domestic'),
('Global'),
('One-Time');
Code language: SQL (Structured Query Language) (sql)
Deuxièmement, déposez et créez la table suppliers
avec la CASCADE
action dans la clé étrangère group_id
:
DROP TABLE suppliers;
CREATE TABLE suppliers (
supplier_id INTEGER PRIMARY KEY,
supplier_name TEXT NOT NULL,
group_id INTEGER,
FOREIGN KEY (group_id)
REFERENCES supplier_groups (group_id)
ON UPDATE CASCADE
ON DELETE CASCADE
);
Code language: SQL (Structured Query Language) (sql)
Troisièmement, insérez quelques fournisseurs dans le tableau suppliers
:
INSERT INTO suppliers (supplier_name, group_id)
VALUES('XYZ Corp', 1);
INSERT INTO suppliers (supplier_name, group_id)
VALUES('ABC Corp', 2);
Code language: SQL (Structured Query Language) (sql)
Quatrièmement, mettez à jour group_id
du Domestic
groupe fournisseur à 100 :
UPDATE supplier_groups
SET group_id = 100
WHERE group_name = 'Domestic';
Code language: SQL (Structured Query Language) (sql)
Cinquièmement, interrogez les données de la table suppliers
:
SELECT * FROM suppliers;
Code language: SQL (Structured Query Language) (sql)
Comme vous pouvez voir la valeur dans le group_id
colonne de la XYZ Corp
dans le tableau suppliers
changé de 1 à 100 lorsque nous avons mis à jour le group_id
dans les suplier_groups
table. Ceci est le résultat de ON UPDATE CASCADE
actions.
Sixièmement, supprimez l'ID de groupe de fournisseurs 2 de suplier_groups
tableau :
DELETE FROM supplier_groups
WHERE group_id = 2;
Code language: SQL (Structured Query Language) (sql)
Septièmement, interrogez les données de la table suppliers
:
SELECT * FROM suppliers;
Code language: SQL (Structured Query Language) (sql)
Le fournisseur id 2 dont le group_id
is 2 a été supprimé lorsque l'identifiant de groupe de fournisseurs 2 a été supprimé des suplier_groups
table. C'est l'effet du ON DELETE CASCADE
actions.
Dans ce didacticiel, vous avez découvert les contraintes de clé étrangère SQLite et comment les utiliser pour renforcer la relation entre les tables associées.