Když vytvoříte tabulku v SQLite, můžete také vytvořit cizí klíč, abyste vytvořili vztah s jinou tabulkou.
Tento článek poskytuje příklad vytvoření cizího klíče při vytváření tabulky v SQLite.
Povolit podporu cizích klíčů
První věc, kterou bychom měli udělat, je povolit podporu cizího klíče (pokud tak již nebylo provedeno).
Za předpokladu, že vaše knihovna SQLite není byly zkompilovány pomocí SQLITE_OMIT_FOREIGN_KEY
nebo SQLITE_OMIT_TRIGGER
definováno, stále budete muset za běhu povolit podporu cizích klíčů.
Chcete-li to provést, spusťte následující příkaz:
PRAGMA foreign_keys = ON;
To umožní vynucení cizího klíče pro vaše připojení k databázi.
Pokud otevřete další připojení, budete muset pro toto připojení spustit stejný příkaz.
Upozorňujeme, že toto nastavení není nutné pro vytváření cizí klíče, ale je to nutné pro vynucení cizí klíče.
Nyní, když jsme povolili podporu cizích klíčů, pojďme do toho a vytvořte cizí klíč.
Příklad
Představte si, že chceme dvě tabulky s následujícími údaji.
Stůl s názvem Zvířata :
PetId PetName TypeId ---------- ---------- ---------- 1 Brush 3 2 Tweet 3 3 Yelp 1 4 Woofer 1 5 Fluff 2
Tabulka s názvem Typ s:
TypeId Type ---------- ---------- 1 Dog 2 Cat 3 Parakeet 4 Hamster
A my chceme TypId ve sloupci Zvířata tabulka odkazující na TypId ve sloupci Typy stůl.
Jinými slovy, chceme vytvořit Pets.TypeId podřízený klíč (s omezením cizího klíče) a Types.TypeId nadřazený klíč (s omezením primárního klíče).
Zatímco rodičovské klíče jsou obvykle také primárním klíčem pro tabulku, není to ve skutečnosti požadavek. V tomto příkladu z něj uděláme primární klíč.
K vytvoření těchto dvou tabulek můžeme použít následující kód.
CREATE TABLE Types(
TypeId INTEGER PRIMARY KEY,
Type
);
CREATE TABLE Pets(
PetId INTEGER PRIMARY KEY,
PetName,
TypeId,
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);
Část, která vytváří cizí klíč, je tato:
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
FOREIGN KEY(TypeId)
část deklaruje Pets.TypeId jako cizí klíč.
I když jsem nekvalifikoval název sloupce s názvem jeho tabulky, víme, že je to Pets.TypeId (a nikoli Typy.TypeId ), protože to spouštíme v CREATE TABLE
výpis pro domácí mazlíčky .
REFERENCES Types(TypeId)
určuje sloupec, na který bude odkazovat náš cizí klíč. V tomto případě bude odkazovat na TypId ve sloupci Typy tabulka.
Nyní, když byly naše tabulky vytvořeny s příslušným cizím klíčem, můžeme přidat data.
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 );
Tabulky nyní obsahují údaje uvedené výše.
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
Porušení cizího klíče
Ale teď zkusme vložit data, která porušují cizí klíč.
Zkusme přidat mazlíčka, který používá neexistující TypID (tj. TypId hodnota, která neexistuje v Typech sloupec).
INSERT INTO Pets VALUES
( NULL, 'Homer', 5 );
Výsledek:
Error: FOREIGN KEY constraint failed
Náš cizí klíč tedy úspěšně zabránil vstupu špatných dat do databáze. Pomohlo nám to tedy zachovat integritu dat.
Pokud se tato chyba nezobrazí a data byla úspěšně vložena, nepovolili jste podporu cizích klíčů. Jak již bylo zmíněno, budete muset povolit podporu cizích klíčů, než budou vaše cizí klíče vynuceny.
Přidání cizího klíče do existující tabulky
ALTER TABLE
příkaz v SQLite je velmi omezený a neumožňuje přidání cizího klíče do existující tabulky.
Pokud tedy potřebujete přidat cizí klíč do existující tabulky, budete muset tabulku zrušit a vytvořit ji znovu s omezením cizího klíče.
Pokud tabulka obsahuje data, která si chcete ponechat, můžete tato data přenést do jiné tabulky, než je po vytvoření nové tabulky s omezením cizího klíče přenesete zpět.