SQLite understøtter relationer ligesom ethvert andet relationsdatabasestyringssystem.
SQLite er en relationel databasestyringssystem (RDBMS). Den bruger den samme relationsmodel, som andre populære DBMS'er (såsom MySQL, Oracle, SQL Server, MS Access) bruger.
Det betyder, at du kan oprette flere tabeller og derefter få dem til at linke til hinanden via et forhold .
Et forhold er, hvor du har flere tabeller, der indeholder relaterede data, og dataene er forbundet med en fælles værdi, der er gemt i begge tabeller.
Følgende diagram illustrerer dette koncept:
Så lad os tilføje endnu en tabel kaldet Albums , så få det linket til vores kunstnere tabel via en relation.
Hvis du gør dette, kan vi slå op, hvilken kunstner et givet album tilhører.
Opret den nye tabel
Så lad os gå videre og oprette albums tabel:
CREATE TABLE Albums( AlbumId INTEGER PRIMARY KEY, AlbumName TEXT NOT NULL, Year TEXT NOT NULL, ArtistId INTEGER NOT NULL, FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId) );
Svarende til da vi oprettede
Kunstnerne
tabel, men på denne har vi tilføjet FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId)
til slutningen af erklæringen.
Dette skaber en fremmednøgle-begrænsning på Albums.ArtistId kolonne. Det betyder, at alle data, der indsættes i denne kolonne, skal matche en værdi i Artists.ArtistId kolonne.
Hvis vi ikke gjorde dette, ville det være muligt at få et album, der ikke tilhører en kunstner. Med andre ord kunne vi have forældreløse optegnelser i vores database. Ikke godt, hvis du forsøger at bevare referentiel integritet.
Hvis vi nu kører en .tables
kommando, skulle vi se begge tabeller i databasen:
sqlite> .tables Albums Artists
Test forholdet
Når vi har oprettet tabellen med den fremmede nøgle, kan vi teste den ved at forsøge at indtaste fejlagtige data. Vi kan prøve at indtaste et album med et ArtistId der ikke matcher et ArtistId i den refererede tabel (dvs. Kunstnerne tabel):
INSERT INTO Albums (AlbumName, Year, ArtistId) VALUES ('Powerslave', '1984', 70);
Dette skulle resultere i følgende:
sqlite> INSERT INTO Albums (AlbumName, Year, ArtistId) ...> VALUES ('Powerslave', '1984', 70); Error: FOREIGN KEY constraint failed
Kører også en SELECT
erklæringen på bordet returnerer ingen data.
Dette skyldes, at den fremmede nøgle-begrænsning blokerede for, at den forkerte værdi blev indsat.
Fungerede ikke?
Hvis du ikke modtager en fejl, når du forsøger at indtaste fejlagtige data som denne, skal du muligvis tjekke dine indstillinger.
Kør følgende kommando:PRAGMA foreign_keys;
Hvis dette resulterer i 0
det betyder, at dine begrænsninger for fremmednøgle er deaktiveret. Faktisk er dette standardadfærden for SQLite (det er for bagudkompatibilitet).
For at aktivere begrænsninger for fremmednøgle skal du indtaste følgende PRAGMA foreign_keys = ON;
Kører nu PRAGMA foreign_keys;
skal returnere 1
, og efterfølgende forsøg på at indsætte en ugyldig fremmednøgle vil mislykkes.
Men hvis PRAGMA foreign_keys;
kommandoen returnerer ingen data, din SQLite-implementering understøtter ikke fremmednøgler (enten fordi den er ældre end version 3.6.19, eller fordi den blev kompileret med SQLITE_OMIT_FOREIGN_KEY
eller SQLITE_OMIT_TRIGGER
defineret).
Indsæt flere data
Nu hvor forholdet er etableret, kan vi tilføje så mange data, som vi har brug for, med tillid til, at kun poster med gyldige fremmednøgler vil blive indsat.
INSERT INTO Albums VALUES (NULL, 'Killers', '1981', 7); INSERT INTO Albums VALUES (NULL, 'Powerslave', '1984', 7); INSERT INTO Albums VALUES (NULL, 'Surfing with the Alien', '1987', 1); INSERT INTO Albums VALUES (NULL, 'Heavy as a Really Heavy Thing', '1995', 11); INSERT INTO Albums VALUES (NULL, 'Yummy Yummy', '1994', 17); INSERT INTO Albums VALUES (NULL, 'Out of the Loop', '2007', 6); INSERT INTO Albums VALUES (NULL, 'Suck on This', '1989', 13); INSERT INTO Albums VALUES (NULL, 'Pork Soda', '1993', 13); INSERT INTO Albums VALUES (NULL, 'Sailing the Seas of Cheese', '1991', 13); INSERT INTO Albums VALUES (NULL, 'Flying in a Blue Dream', '1989', 1); INSERT INTO Albums VALUES (NULL, 'Black Swans and Wormhole Wizards', '2010', 1); INSERT INTO Albums VALUES (NULL, 'Somewhere in Time', '1986', 7); INSERT INTO Albums VALUES (NULL, 'Big Red Car', '1995', 17);
Dernæst vælger vi data fra begge tabeller ved hjælp af en JOIN
erklæring.