SQLite obsługuje relacje, tak jak każdy inny system zarządzania relacyjnymi bazami danych.
SQLite jest relacją system zarządzania bazą danych (RDBMS). Wykorzystuje ten sam model relacyjny, z którego korzystają inne popularne systemy DBMS (takie jak MySQL, Oracle, SQL Server, MS Access).
Oznacza to, że możesz utworzyć wiele tabel, a następnie połączyć je ze sobą za pomocą relacji .
związek to miejsce, w którym masz wiele tabel zawierających powiązane dane, a dane są połączone wspólną wartością, która jest przechowywana w obu tabelach.
Poniższy diagram ilustruje tę koncepcję:
Dodajmy więc kolejną tabelę o nazwie Albumy , a następnie powiąż to z naszymi artystami tabela za pośrednictwem relacji.
Dzięki temu będziemy mogli sprawdzić, do którego artysty należy dany album.
Utwórz nową tabelę
Więc śmiało stwórzmy Albumy tabela:
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) );
Podobnie jak wtedy, gdy stworzyliśmy
Artyści
tabeli, jednak do tej tabeli dodaliśmy FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId)
do końca oświadczenia.
Tworzy to ograniczenie klucza obcego na Albums.ArtistId kolumna. Oznacza to, że wszelkie dane wstawiane do tej kolumny muszą odpowiadać wartości w Artists.ArtistId kolumna.
Gdybyśmy tego nie zrobili, moglibyśmy mieć album, który nie należy do artysty. Innymi słowy, moglibyśmy mieć osierocone rekordy w naszej bazie danych. Niedobrze, jeśli starasz się zachować integralność referencyjną.
Teraz, jeśli uruchomimy .tables
polecenie, powinniśmy zobaczyć obie tabele w bazie danych:
sqlite> .tables Albums Artists
Przetestuj związek
Po utworzeniu tabeli z kluczem obcym możemy ją przetestować, próbując wprowadzić błędne dane. Możemy spróbować wprowadzić album z ArtistId który nie pasuje do ArtistId we wskazanej tabeli (tj. Artyści tabela):
INSERT INTO Albums (AlbumName, Year, ArtistId) VALUES ('Powerslave', '1984', 70);
Powinno to skutkować następującymi efektami:
sqlite> INSERT INTO Albums (AlbumName, Year, ArtistId) ...> VALUES ('Powerslave', '1984', 70); Error: FOREIGN KEY constraint failed
Ponadto uruchomienie SELECT
oświadczenie w tabeli nie zwróci żadnych danych.
Dzieje się tak, ponieważ ograniczenie klucza obcego zablokowało wstawienie nieprawidłowej wartości.
Nie działało?
Jeśli podczas próby wprowadzenia błędnych danych nie zostanie wyświetlony komunikat o błędzie, konieczne może być sprawdzenie ustawień.
Uruchom następujące polecenie:PRAGMA foreign_keys;
Jeśli to skutkuje w 0
oznacza to, że ograniczenia klucza obcego są wyłączone. W rzeczywistości jest to domyślne zachowanie SQLite (dla kompatybilności wstecznej).
Aby włączyć ograniczenia klucza obcego, wpisz następujące PRAGMA foreign_keys = ON;
Teraz uruchamiam PRAGMA foreign_keys;
powinien zwrócić 1
, a kolejne próby wstawienia nieprawidłowego klucza obcego zakończą się niepowodzeniem.
Jednakże, jeśli PRAGMA foreign_keys;
polecenie nie zwraca żadnych danych, twoja implementacja SQLite nie obsługuje kluczy obcych (albo dlatego, że jest starsza niż wersja 3.6.19 lub dlatego, że została skompilowana z SQLITE_OMIT_FOREIGN_KEY
lub SQLITE_OMIT_TRIGGER
zdefiniowane).
Wstaw więcej danych
Teraz, gdy relacja została nawiązana, możemy dodać tyle danych, ile potrzebujemy, mając pewność, że zostaną wstawione tylko rekordy z prawidłowymi kluczami obcymi.
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);
Następnie wybierzemy dane z obu tabel za pomocą JOIN
oświadczenie.