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

Créer une clé étrangère dans SQLite

Lorsque vous créez une table dans SQLite, vous pouvez également créer une clé étrangère afin d'établir une relation avec une autre table.

Cet article fournit un exemple de création d'une clé étrangère lors de la création d'une table dans SQLite.

Activer la prise en charge des clés étrangères

La première chose à faire est d'activer la prise en charge des clés étrangères (si cela n'a pas déjà été fait).

En supposant que votre bibliothèque SQLite n'a pas été compilé avec SQLITE_OMIT_FOREIGN_KEY ou SQLITE_OMIT_TRIGGER défini, vous devrez toujours activer la prise en charge des clés étrangères lors de l'exécution.

Pour ce faire, exécutez l'instruction suivante :

PRAGMA foreign_keys = ON;

Cela activera l'application de la clé étrangère pour votre connexion à la base de données.

Si vous ouvrez une autre connexion, vous devrez exécuter la même instruction pour cette connexion.

Notez que ce paramètre n'est pas requis pour la création clés étrangères, mais il est nécessaire pour appliquer clés étrangères.

Maintenant que nous avons activé la prise en charge des clés étrangères, continuons et créons une clé étrangère.

Exemple

Imaginez que nous voulions deux tables avec les données suivantes.

Tableau intitulé Animaux de compagnie :

PetId       PetName     TypeId    
----------  ----------  ----------
1           Brush       3         
2           Tweet       3         
3           Yelp        1         
4           Woofer      1         
5           Fluff       2         

Tableau appelé Type s :

TypeId      Type      
----------  ----------
1           Dog       
2           Cat       
3           Parakeet  
4           Hamster   

Et nous voulons le TypeId colonne des Animaux domestiques table pour référencer le TypeId colonne des Types table.

En d'autres termes, nous voulons faire de Pets.TypeId la clé enfant (avec une contrainte de clé étrangère) et Types.TypeId la clé parent (avec une contrainte de clé primaire).

Bien que les clés parentes soient généralement également la clé primaire de la table, ce n'est pas vraiment une exigence. Dans cet exemple, nous en ferons la clé primaire.

Nous pouvons utiliser le code suivant pour créer ces deux tables.

CREATE TABLE Types( 
    TypeId INTEGER PRIMARY KEY, 
    Type
);

CREATE TABLE Pets( 
    PetId INTEGER PRIMARY KEY, 
    PetName,
    TypeId,
    FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);

La partie qui crée la clé étrangère est celle-ci :

FOREIGN KEY(TypeId) REFERENCES Types(TypeId)

La FOREIGN KEY(TypeId) part déclare Pets.TypeId comme clé étrangère.

Bien que je n'aie pas qualifié le nom de la colonne avec son nom de table, nous savons qu'il s'agit de Pets.TypeId (et non Types.TypeId ) car nous l'exécutons dans le CREATE TABLE déclaration pour les animaux de compagnie .

Les REFERENCES Types(TypeId) spécifie la colonne à laquelle notre clé étrangère fera référence. Dans ce cas, il référencera le TypeId colonne des Types tableau.

Maintenant que nos tables ont été créées avec la clé étrangère appropriée, nous pouvons ajouter des données.

INSERT INTO Types VALUES 
    ( NULL, 'Dog' ),
    ( NULL, 'Cat' ),
    ( NULL, 'Parakeet' ),
    ( NULL, 'Hamster' );

INSERT INTO Pets VALUES 
    ( NULL, 'Brush', 3 ),
    ( NULL, 'Tweet', 3 ),
    ( NULL, 'Yelp', 1 ),
    ( NULL, 'Woofer', 1 ),
    ( NULL, 'Fluff', 2 );

Les tableaux contiennent désormais les données présentées ci-dessus.

sqlite> SELECT * FROM Pets;
PetId       PetName     TypeId    
----------  ----------  ----------
1           Brush       3         
2           Tweet       3         
3           Yelp        1         
4           Woofer      1         
5           Fluff       2         
sqlite> SELECT * FROM Types;
TypeId      Type      
----------  ----------
1           Dog       
2           Cat       
3           Parakeet  
4           Hamster   

Violation de clé étrangère

Mais essayons maintenant d'insérer des données qui violent la clé étrangère.

Essayons d'ajouter un animal de compagnie qui utilise un TypeID inexistant (c'est-à-dire un TypeId valeur qui n'existe pas dans les Types colonne).

INSERT INTO Pets VALUES 
    ( NULL, 'Homer', 5 );

Résultat :

Error: FOREIGN KEY constraint failed

Ainsi, notre clé étrangère a réussi à empêcher l'entrée de mauvaises données dans la base de données. Cela nous a donc aidés à maintenir l'intégrité des données.

Si vous n'obtenez pas cette erreur et que les données ont été insérées avec succès, vous n'avez pas activé la prise en charge des clés étrangères. Comme mentionné, vous devrez activer la prise en charge des clés étrangères avant que vos clés étrangères ne soient appliquées.

Ajouter une clé étrangère à une table existante

Le ALTER TABLE L'instruction SQLite est très limitée et ne permet pas d'ajouter une clé étrangère à une table existante.

Par conséquent, si vous devez ajouter une clé étrangère à une table existante, vous devrez supprimer la table et la recréer avec la contrainte de clé étrangère.

Si la table contient des données que vous souhaitez conserver, vous pouvez transférer ces données vers une autre table, avant de les retransférer une fois que vous avez créé la nouvelle table avec la contrainte de clé étrangère.