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

Trouver des violations de clé étrangère dans SQLite

SQLite inclut une instruction PRAGMA qui vous permet de vérifier les violations de clé étrangère sur une base de données entière ou une table donnée.

L'instruction est PRAGMA foreign_key_check , et cela fonctionne comme suit.

Syntaxe

Vous pouvez l'utiliser de deux manières :

PRAGMA schema.foreign_key_check;
PRAGMA schema.foreign_key_check(table-name); 

La première ligne vérifie toute la base de données, tandis que la seconde ne vérifie qu'une table spécifique.

Le schema facultatif l'argument spécifie le nom d'une base de données attachée ou main ou temp pour les bases de données principale et TEMP. Si schema est omis, main est assumé.

Exemple

Créons deux tables avec une relation entre elles.

Dans ce cas, les Animaux table a une clé étrangère qui référence le TypeId colonne sur les Types tableau.

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

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

Entrons maintenant dans les données qui violent la contrainte de clé étrangère.

PRAGMA foreign_keys = OFF;

INSERT INTO Types VALUES 
    ( 1, 'Dog' ),
    ( 2, 'Cat' );

INSERT INTO Pets VALUES 
    ( 1, 'Homer', 3 ); 

Le deuxième INSERT l'instruction viole la contrainte de clé étrangère. C'est parce qu'il insère une valeur de 3 dans le Pets.TypeId colonne, lorsqu'il n'y a pas de valeur correspondante dans Types.TypeId colonne.

Une chose importante à noter ici est que j'ai explicitement désactivé les clés étrangères en utilisant PRAGMA foreign_keys = OFF . C'est le paramètre par défaut dans SQLite, mais je voulais que ce soit clair pour cet exemple.

Vérifions maintenant la base de données pour les violations de clé étrangère.

PRAGMA foreign_key_check; 

Résultat :

table rowid parent fkid ---------- ---------- ---------- ----------Animaux 1 Types 0 

Cela nous indique que les Animaux table a une violation de clé étrangère sur la ligne avec un ROWID de 1. Il nous indique également le nom de la table parent, ainsi que l'ID de clé étrangère.

Ajoutons plus de données aux animaux de compagnie table et relancez la vérification. Les deux premières lignes adhèrent à la clé étrangère, mais pas la dernière.

INSERT INTO Pets VALUES 
    ( NULL, 'Yelp', 1 ),
    ( NULL, 'Fluff', 2 ),
    ( NULL, 'Brush', 4 );

PRAGMA foreign_key_check; 

Résultat :

table rowid parent fkid ---------- ---------- ---------- ----------Animaux 1 Types 0 Animaux 4 Types 0 

Nous avons maintenant deux lignes renvoyées lors de la vérification de toute la base de données pour les violations de clé étrangère.

Vérifier un tableau spécifique

Vous pouvez également spécifier une table pour exécuter la vérification.

Voici un exemple de réécriture de la vérification précédente pour spécifier uniquement les animaux de compagnie tableau.

PRAGMA foreign_key_check(Pets); 

Résultat :

table rowid parent fkid ---------- ---------- ---------- ----------Animaux 1 Types 0 Animaux 4 Types 0 

Même résultat.

Voici le résultat si je spécifie l'autre table.

PRAGMA foreign_key_check(Types); 

Résultat :

 

(Il est vide car il n'y a pas de résultats.)

Spécifier un schéma

Comme mentionné, vous pouvez également spécifier le schéma.

PRAGMA main.foreign_key_check(Pets); 

Résultat :

table rowid parent fkid ---------- ---------- ---------- ----------Animaux 1 Types 0 Animaux 4 Types 0 

Dans mon cas, j'ai utilisé la base de données principale, mais vous pouvez remplacer main avec le nom de votre base de données attachée.

Comment appliquer les clés étrangères

Comme mentionné, SQLite n'applique pas les clés étrangères à moins que vous ne spécifiiez explicitement qu'elles doivent être appliquées.

Vous pouvez appliquer des clés étrangères en utilisant PRAGMA foreign_keys = ON .

Voir Comment activer la prise en charge des clés étrangères dans SQLite pour plus d'informations et d'exemples.