Når du opretter en tabel i SQLite, kan du også oprette en fremmednøgle for at etablere en relation til en anden tabel.
Denne artikel giver et eksempel på oprettelse af en fremmednøgle, når du opretter en tabel i SQLite.
Aktivér understøttelse af fremmed nøgle
Den første ting, vi bør gøre, er at aktivere understøttelse af fremmednøgle (hvis det ikke allerede er blevet gjort).
Forudsat at dit SQLite-bibliotek ikke har gjort det blevet kompileret med SQLITE_OMIT_FOREIGN_KEY
eller SQLITE_OMIT_TRIGGER
defineret, skal du stadig aktivere fremmednøgleunderstøttelse under kørsel.
For at gøre dette skal du køre følgende sætning:
PRAGMA foreign_keys = ON;
Dette vil aktivere fremmednøglehåndhævelse for din databaseforbindelse.
Hvis du åbner en anden forbindelse, skal du køre den samme sætning for den forbindelse.
Bemærk, at denne indstilling ikke er påkrævet for at oprette fremmednøgler, men det er påkrævet for at håndhæve fremmednøgler.
Nu hvor vi har aktiveret understøttelse af fremmed nøgle, lad os gå videre og oprette en fremmed nøgle.
Eksempel
Forestil dig, at vi vil have to tabeller med følgende data.
Bord kaldet Kæledyr :
PetId PetName TypeId ---------- ---------- ---------- 1 Brush 3 2 Tweet 3 3 Yelp 1 4 Woofer 1 5 Fluff 2
Tabel kaldet Type s:
TypeId Type ---------- ---------- 1 Dog 2 Cat 3 Parakeet 4 Hamster
Og vi vil have TypeId kolonne i Kæledyr tabel for at referere til TypeId kolonne i Typer bord.
Med andre ord vil vi lave Pets.TypeId den underordnede nøgle (med en fremmednøglebegrænsning) og Types.TypeId den overordnede nøgle (med en primær nøglebegrænsning).
Mens forældrenøgler normalt også er den primære nøgle til tabellen, er dette faktisk ikke et krav. I dette eksempel gør vi det til den primære nøgle.
Vi kan bruge følgende kode til at oprette disse to tabeller.
CREATE TABLE Types(
TypeId INTEGER PRIMARY KEY,
Type
);
CREATE TABLE Pets(
PetId INTEGER PRIMARY KEY,
PetName,
TypeId,
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);
Den del, der opretter fremmednøglen, er denne:
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
FOREIGN KEY(TypeId)
del erklærer Pets.TypeId som fremmednøgle.
Selvom jeg ikke kvalificerede kolonnenavnet med dets tabelnavn, ved vi, at det er Pets.TypeId (og ikke Types.TypeId ), fordi vi kører dette i CREATE TABLE
erklæring for Kæledyr .
REFERENCES Types(TypeId)
angiver den kolonne, som vores fremmednøgle vil referere til. I dette tilfælde vil den referere til TypeId kolonne i Typer tabel.
Nu hvor vores tabeller er blevet oprettet med den passende fremmednøgle, kan vi tilføje data.
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 );
Tabellerne indeholder nu ovenstående data.
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
Krænkelse af udenlandsk nøgle
Men lad os nu prøve at indsætte data, der overtræder fremmednøglen.
Lad os prøve at tilføje et kæledyr, der bruger et ikke-eksisterende TypeID (dvs. et TypeId værdi, der ikke findes i Typer kolonne).
INSERT INTO Pets VALUES
( NULL, 'Homer', 5 );
Resultat:
Error: FOREIGN KEY constraint failed
Så vores fremmednøgle forhindrede med succes dårlige data i at komme ind i databasen. Det hjalp os derfor med at bevare dataintegriteten.
Hvis du ikke får denne fejl, og dataene blev indsat, har du ikke aktiveret understøttelse af fremmednøgle. Som nævnt skal du aktivere understøttelse af fremmednøgle, før dine fremmednøgler bliver håndhævet.
Tilføjelse af en fremmednøgle til en eksisterende tabel
ALTER TABLE
sætning i SQLite er meget begrænset, og den tillader ikke tilføjelse af en fremmednøgle til en eksisterende tabel.
Derfor, hvis du har brug for at tilføje en fremmednøgle til en eksisterende tabel, bliver du nødt til at droppe tabellen og oprette den igen med fremmednøglebegrænsningen.
Hvis tabellen indeholder data, som du vil beholde, kan du overføre disse data til en anden tabel, før du overfører dem tilbage, når du har oprettet den nye tabel med fremmednøglebegrænsningen.