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

SQLite - Utwórz relację

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przetłumaczyć funkcję array_agg PostgreSQL na SQLite?

  2. Jaki jest limit zmiennych SQL, które można określić w pojedynczym zapytaniu execSQL?

  3. Rozszerzona składnia zapytań SQLite w systemie Android

  4. Transakcja SQLite

  5. Kopiowanie sqlite w zasobach Android Studio nie działa