SQLite stöder relationer precis som alla andra relationsdatabashanteringssystem.
SQLite är en relationell databashanteringssystem (RDBMS). Den använder samma relationsmodell som andra populära DBMS (som MySQL, Oracle, SQL Server, MS Access) använder.
Vad detta betyder är att du kan skapa flera tabeller och sedan få dem att länka till varandra via en relation .
Ett förhållande är där du har flera tabeller som innehåller relaterad data, och data är länkade med ett gemensamt värde som lagras i båda tabellerna.
Följande diagram illustrerar detta koncept:
Så låt oss lägga till en annan tabell som heter Album , sedan länka det till våra Artister tabell via en relation.
Genom att göra detta kommer vi att kunna slå upp vilken artist ett givet album tillhör.
Skapa den nya tabellen
Så låt oss gå vidare och skapa Album tabell:
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) );
Liknar när vi skapade
Artister
tabell, men på den här har vi lagt till FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId)
till slutet av uttalandet.
Detta skapar en främmande nyckel-begränsning på Albums.ArtistId kolumn. Vad detta betyder är att all data som infogas i den här kolumnen måste matcha ett värde i Artists.ArtistId kolumn.
Om vi inte gjorde det här skulle det vara möjligt att ha ett album som inte tillhör en artist. Med andra ord kan vi ha föräldralösa poster i vår databas. Inte bra om du försöker bibehålla referensintegritet.
Om vi nu kör en .tables
kommandot bör vi se båda tabellerna i databasen:
sqlite> .tables Albums Artists
Testa förhållandet
När vi väl har skapat tabellen med den främmande nyckeln kan vi testa den genom att försöka mata in felaktiga data. Vi kan försöka ange ett album med ett ArtistId som inte matchar ett ArtistId i den refererade tabellen (dvs. Artisterna tabell):
INSERT INTO Albums (AlbumName, Year, ArtistId) VALUES ('Powerslave', '1984', 70);
Detta bör resultera i följande:
sqlite> INSERT INTO Albums (AlbumName, Year, ArtistId) ...> VALUES ('Powerslave', '1984', 70); Error: FOREIGN KEY constraint failed
Kör också en SELECT
uttalande på bordet returnerar inga data.
Detta beror på att den främmande nyckelbegränsningen blockerade fel värde från att infogas.
Fungerade inte?
Om du inte får ett felmeddelande när du försöker ange felaktig data som denna, kan du behöva kontrollera dina inställningar.
Kör följande kommando:PRAGMA foreign_keys;
Om detta resulterar i 0
det betyder att dina främmande nyckelbegränsningar är inaktiverade. Faktum är att detta är standardbeteendet för SQLite (det är för bakåtkompatibilitet).
För att aktivera begränsningar för främmande nyckel, skriv följande PRAGMA foreign_keys = ON;
Kör nu PRAGMA foreign_keys;
bör returnera 1
, och efterföljande försök att infoga en ogiltig främmande nyckel kommer att misslyckas.
Men om PRAGMA foreign_keys;
kommandot returnerar inga data, din SQLite-implementering stöder inte främmande nycklar (antingen för att den är äldre än version 3.6.19 eller för att den kompilerades med SQLITE_OMIT_FOREIGN_KEY
eller SQLITE_OMIT_TRIGGER
definieras).
Infoga mer data
Nu när relationen har etablerats kan vi lägga till så mycket data som vi behöver, med förtroende för att endast poster med giltiga främmande nycklar kommer att infogas.
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);
Därefter väljer vi data från båda tabellerna med en JOIN
uttalande.