sql >> Databáze >  >> RDS >> SQLite

SQLite - Vytvořte vztah

SQLite podporuje vztahy stejně jako jakýkoli jiný systém správy relačních databází.

SQLite je relační systém správy databází (RDBMS). Využívá stejný relační model, který používají jiné populární DBMS (jako MySQL, Oracle, SQL Server, MS Access).

To znamená, že můžete vytvořit více tabulek a poté je nechat propojit pomocí vztahu .

vztah je místo, kde máte více tabulek, které obsahují související data, a data jsou propojena společnou hodnotou, která je uložena v obou tabulkách.

Následující diagram ilustruje tento koncept:

Přidejme tedy další tabulku nazvanou Alba , pak to propojte s našimi Umělci tabulky prostřednictvím vztahu.

To nám umožní vyhledat, kterému interpretovi dané album patří.

Vytvořte novou tabulku

Pojďme tedy do toho a vytvořte Alba tabulka:

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)
);

Podobně jako když jsme vytvořili Umělci Do této tabulky jsme však přidali FOREIGN KEY(ArtistId) REFERENCES Artists(ArtistId) do konce výpisu.

Tím se vytvoří omezení cizího klíče na Albums.ArtistId sloupec. To znamená, že všechna data vložená do tohoto sloupce musí odpovídat hodnotě v Artists.ArtistId sloupec.

Pokud bychom to neudělali, bylo by možné mít album, které nepatří žádnému interpretovi. Jinými slovy, mohli bychom mít v naší databázi osiřelé záznamy. Není dobré, pokud se snažíte zachovat referenční integritu.

Nyní, když spustíme .tables příkaz, měli bychom vidět obě tabulky v databázi:

sqlite> .tables
Albums   Artists

Otestujte vztah

Jakmile vytvoříme tabulku s cizím klíčem, můžeme ji otestovat pokusem o zadání chybných dat. Můžeme zkusit zadat album s ArtistId který neodpovídá ArtistId v odkazované tabulce (tj. Umělci tabulka):

INSERT INTO Albums (AlbumName, Year, ArtistId)
VALUES ('Powerslave', '1984', 70);

Výsledkem by mělo být následující:

sqlite> INSERT INTO Albums (AlbumName, Year, ArtistId)
   ...> VALUES ('Powerslave', '1984', 70);
Error: FOREIGN KEY constraint failed

Také spuštění SELECT příkaz v tabulce nevrátí žádná data.

Důvodem je, že omezení cizího klíče zablokovalo vložení nesprávné hodnoty.

Nefungovalo?

Pokud se při pokusu o zadání chybných dat, jako je tato, neobjeví chyba, možná budete muset zkontrolovat nastavení.

Spusťte následující příkaz:PRAGMA foreign_keys;

Pokud to má za následek 0 to znamená, že vaše omezení cizího klíče jsou zakázána. Ve skutečnosti se jedná o výchozí chování SQLite (je to kvůli zpětné kompatibilitě).

Chcete-li povolit omezení cizího klíče, zadejte následující PRAGMA foreign_keys = ON;

Nyní spusťte PRAGMA foreign_keys; by měl vrátit 1 a následné pokusy o vložení neplatného cizího klíče selžou.

Pokud však PRAGMA foreign_keys; příkaz nevrací žádná data, vaše implementace SQLite nepodporuje cizí klíče (buď proto, že je starší než verze 3.6.19, nebo proto, že byla zkompilována pomocí SQLITE_OMIT_FOREIGN_KEY nebo SQLITE_OMIT_TRIGGER definováno).

Vložit další data

Nyní, když byl vztah navázán, můžeme přidat tolik dat, kolik potřebujeme, s jistotou, že budou vloženy pouze záznamy s platnými cizími klíči.

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ále vybereme data z obou tabulek pomocí JOIN prohlášení.


  1. PHP/MySQL vložit řádek a získat 'id'

  2. vložení obrázku do html e-mailu

  3. Vytvořte uživatele z řetězcových proměnných v bloku PL/SQL

  4. Jak nainstalovat SQL Server na Mac s VirtualBoxem