SQLite indeholder en PRAGMA-sætning, der giver dig mulighed for at tjekke for fremmednøglebrud på en hel database eller en given tabel.
Udsagnet er PRAGMA foreign_key_check
, og det fungerer som følger.
Syntaks
Du kan bruge det på en af to måder:
PRAGMA schema.foreign_key_check;
PRAGMA schema.foreign_key_check(table-name);
Den første linje tjekker hele databasen, mens den anden kun tjekker en bestemt tabel.
Det valgfrie schema
argument angiver navnet på en vedhæftet database eller main eller temp for hoved- og TEMP-databaserne. Hvis schema
er udeladt, main er antaget.
Eksempel
Lad os oprette to tabeller med et forhold mellem dem.
I dette tilfælde er Kæledyr tabellen har en fremmednøgle, der refererer til TypeId kolonne på Typer tabel.
CREATE TABLE Types(
TypeId INTEGER PRIMARY KEY,
Type
);
CREATE TABLE Pets(
PetId INTEGER PRIMARY KEY,
PetName,
TypeId,
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);
Lad os nu indtaste data, der overtræder begrænsningen for fremmednøgle.
PRAGMA foreign_keys = OFF;
INSERT INTO Types VALUES
( 1, 'Dog' ),
( 2, 'Cat' );
INSERT INTO Pets VALUES
( 1, 'Homer', 3 );
Den anden INSERT
erklæringen overtræder begrænsningen for fremmednøgle. Dette skyldes, at den indsætter en værdi på 3 i Pets.TypeId kolonne, når der ikke er en tilsvarende værdi i Types.TypeId kolonne.
En vigtig ting at bemærke her er, at jeg eksplicit deaktiverede fremmednøgler ved at bruge PRAGMA foreign_keys = OFF
. Dette er standardindstillingen i SQLite, men jeg ønskede at gøre det klart for dette eksempel.
Lad os nu tjekke databasen for krænkelser af fremmednøgler.
PRAGMA foreign_key_check;
Resultat:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0
Dette fortæller os, at Kæledyr tabellen har en overtrædelse af en fremmednøgle på rækken med en ROWID på 1. Den fortæller os også navnet på den overordnede tabel samt fremmednøgle-id'et.
Lad os tilføje flere data til Kæledyr bordet og kør kontrollen igen. De første to linjer klæber til fremmednøglen, men den sidste linje gør det ikke.
INSERT INTO Pets VALUES
( NULL, 'Yelp', 1 ),
( NULL, 'Fluff', 2 ),
( NULL, 'Brush', 4 );
PRAGMA foreign_key_check;
Resultat:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
Vi har nu returneret to rækker, når vi tjekker hele databasen for krænkelser af fremmednøgler.
Tjek en specifik tabel
Du kan også angive en tabel at køre checken imod.
Her er et eksempel på omskrivning af den forrige kontrol for kun at angive kæledyrene tabel.
PRAGMA foreign_key_check(Pets);
Resultat:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
Samme resultat.
Her er resultatet, hvis jeg angiver den anden tabel.
PRAGMA foreign_key_check(Types);
Resultat:
(Den er tom, fordi der ikke er nogen resultater.)
Angiv et skema
Som nævnt kan du også angive skemaet.
PRAGMA main.foreign_key_check(Pets);
Resultat:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
I mit tilfælde brugte jeg hoveddatabasen, men du kunne erstatte main
med navnet på din vedhæftede database.
Sådan håndhæves fremmednøgler
Som nævnt håndhæver SQLite ikke fremmednøgler, medmindre du udtrykkeligt angiver, at de skal håndhæves.
Du kan gennemtvinge fremmednøgler ved at bruge PRAGMA foreign_keys = ON
.
Se Sådan aktiverer du understøttelse af fremmed nøgle i SQLite for mere information og eksempler.