SQLite
 sql >> Base de données >  >> RDS >> SQLite

Clé étrangère SQLite

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.