SQLite
 sql >> Baza danych >  >> RDS >> SQLite

Utwórz klucz obcy w SQLite

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLite - Utwórz kopię zapasową bazy danych do pliku

  2. 3 sposoby na wygenerowanie skryptu CREATE TABLE z istniejącej tabeli w SQLite

  3. Android- setPeriodic for JobScheduler nie działa

  4. GROUP_CONCAT w SQLite

  5. Jak sprawić, by operator LIKE SQLite uwzględniał wielkość liter?