Kiedy tworzysz tabelę w SQLite, możesz również utworzyć klucz obcy w celu ustanowienia relacji z inną tabelą.
Ten artykuł zawiera przykład tworzenia klucza obcego podczas tworzenia tabeli w SQLite.
Włącz obsługę kluczy obcych
Pierwszą rzeczą, którą powinniśmy zrobić, to włączyć obsługę kluczy obcych (jeśli nie zostało to jeszcze zrobione).
Zakładając, że Twoja biblioteka SQLite nie ma został skompilowany z SQLITE_OMIT_FOREIGN_KEY
lub SQLITE_OMIT_TRIGGER
zdefiniowane, nadal będziesz musiał włączyć obsługę kluczy obcych w czasie wykonywania.
Aby to zrobić, uruchom następującą instrukcję:
PRAGMA foreign_keys = ON;
Umożliwi to wymuszenie klucza obcego dla połączenia z bazą danych.
Jeśli otworzysz inne połączenie, musisz uruchomić tę samą instrukcję dla tego połączenia.
Pamiętaj, że to ustawienie nie jest wymagane do tworzenia klucze obce, ale jest to wymagane do wymuszania klucze obce.
Teraz, gdy włączyliśmy obsługę kluczy obcych, przejdźmy dalej i utwórzmy klucz obcy.
Przykład
Wyobraź sobie, że chcemy mieć dwie tabele z następującymi danymi.
Stół o nazwie Zwierzęta :
PetId PetName TypeId ---------- ---------- ---------- 1 Brush 3 2 Tweet 3 3 Yelp 1 4 Woofer 1 5 Fluff 2
Tabela o nazwie Typ s:
TypeId Type ---------- ---------- 1 Dog 2 Cat 3 Parakeet 4 Hamster
I chcemy TypeId kolumna Zwierzęta tabela z odniesieniem do TypeId kolumna Typy stół.
Innymi słowy, chcemy, aby Pets.TypeId klucz podrzędny (z ograniczeniem klucza obcego) i Types.TypeId klucz nadrzędny (z ograniczeniem klucza podstawowego).
Chociaż klucze nadrzędne są zwykle również kluczem podstawowym dla tabeli, w rzeczywistości nie jest to wymagane. W tym przykładzie uczynimy go kluczem podstawowym.
Do utworzenia tych dwóch tabel możemy użyć następującego kodu.
CREATE TABLE Types(
TypeId INTEGER PRIMARY KEY,
Type
);
CREATE TABLE Pets(
PetId INTEGER PRIMARY KEY,
PetName,
TypeId,
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);
Część, która tworzy klucz obcy, to:
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
FOREIGN KEY(TypeId)
część deklaruje Pets.TypeId jako klucz obcy.
Chociaż nie określiłem nazwy kolumny wraz z nazwą tabeli, wiemy, że jest to Zwierzęta.TypeId (a nie Types.TypeId ), ponieważ uruchamiamy to w CREATE TABLE
oświadczenie dla Zwierząt domowych .
REFERENCES Types(TypeId)
określa kolumnę, do której będzie się odwoływać nasz klucz obcy. W tym przypadku będzie odwoływać się do TypeId kolumna Typy tabela.
Teraz, gdy nasze tabele zostały utworzone z odpowiednim kluczem obcym, możemy dodać dane.
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 );
Tabele zawierają teraz dane pokazane powyżej.
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
Naruszenie klucza obcego
Ale teraz spróbujmy wstawić dane, które naruszają klucz obcy.
Spróbujmy dodać zwierzaka, który używa nieistniejącego TypeID (tj. TypeId wartość, która nie istnieje w Typach kolumna).
INSERT INTO Pets VALUES
( NULL, 'Homer', 5 );
Wynik:
Error: FOREIGN KEY constraint failed
Tak więc nasz klucz obcy skutecznie zapobiegał przedostawaniu się złych danych do bazy danych. Pomogło nam to zatem zachować integralność danych.
Jeśli nie pojawia się ten błąd, a dane zostały pomyślnie wstawione, oznacza to, że obsługa kluczy obcych nie została włączona. Jak wspomniano, musisz włączyć obsługę kluczy obcych, zanim Twoje klucze obce zostaną wyegzekwowane.
Dodawanie klucza obcego do istniejącej tabeli
ALTER TABLE
Instrukcja w SQLite jest bardzo ograniczona i nie pozwala na dodanie klucza obcego do istniejącej tabeli.
Dlatego jeśli chcesz dodać klucz obcy do istniejącej tabeli, musisz usunąć tabelę i utworzyć ją ponownie z ograniczeniem klucza obcego.
Jeśli tabela zawiera dane, które chcesz zachować, możesz przenieść te dane do innej tabeli, zanim przeniesiesz je z powrotem po utworzeniu nowej tabeli z ograniczeniem klucza obcego.