Problém:
Chcete vytvořit cizí klíč pro tabulku v databázi.
Příklad:
Rádi bychom vytvořili tabulku s názvem student
který obsahuje cizí klíč, který odkazuje na id
sloupec v tabulce city
.
Řešení 1 (nová tabulka):
CREATE TABLE student ( id INT PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, city_id INT FOREIGN KEY REFERENCES city(id) );
Diskuse:
Chcete-li vytvořit novou tabulku obsahující sloupec cizího klíče, který odkazuje na jinou tabulku, použijte klíčové slovo FOREIGN KEY REFERENCES
na konci definice tohoto sloupce. Za tím uveďte název odkazované tabulky a název odkazovaného sloupce v závorkách.
V našem příkladu vytvoříme tabulku student
pomocí CREATE TABLE
doložka. Vypíšeme názvy sloupců a jejich příslušné datové typy vložíme do závorek. Sloupec city_id
je cizí klíč v této tabulce a označuje hodnotu ID uloženého ve sloupci id
v tabulce city
. Píšeme FOREIGN KEY REFERENCES
na konci definice tohoto sloupce a za ním s odkazovanou tabulkou a sloupcem:city(id)
.
Mějte na paměti, že pro tabulku můžete vytvořit více než jeden cizí klíč.
Řešení 2 (nová tabulka):
CREATE TABLE student ( id INT PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, city_id INT, FOREIGN KEY (city_id) REFERENCES city(id) );
Diskuse:
Dalším způsobem, jak definovat cizí klíč během vytváření tabulky, je použít FOREIGN KEY REFERENCES
klauzule na konci definic sloupců. V tomto případě za FOREIGN KEY
klauzule označujeme sloupec cizího klíče. Následuje REFERENCES
klauzule spolu s názvem odkazované tabulky a sloupce.
Cizí klíče můžete vytvořit ve více než jednom sloupci, jak je znázorněno níže:
Řešení 3 (nová tabulka):
CREATE TABLE student ( id INT PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, score_id INT, subject_id INT, CONSTRAINT fk_student_score_subject_id FOREIGN KEY (subject_id, score_id) REFERENCES score_subject(subject_id, score_id) );
V tomto příkladu omezení fk_student_score_subject_id
je cizí klíč sestávající ze dvou sloupců:score_id
a subject_id
. Tyto dva sloupce cizího klíče odkazují na dva sloupce v tabulce score_subject
– score_id
a subject_id
.
Zde je další příklad:
Řešení 4 (nová tabulka):
CREATE TABLE student ( id INT PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, city_id INT, CONSTRAINT fk_student_city_id FOREIGN KEY (city_id) REFERENCES city(id) );
Diskuse:
V tomto kódu máme opět CONSTRAINT
klauzule s názvem tohoto omezení. Používejte jména, která jsou snadno čitelná a srozumitelná. V našem příkladu používáme název fk_student_city_id
, který označuje příslušnou tabulku a sloupec. Dále napíšeme FOREIGN KEY
a přidejte (v závorkách) název sloupce, který se stane cizím klíčem. Pak máme REFERENCES
klauzule následovaná názvem odkazované tabulky a sloupce (zde:id
).
Řešení 5 (stávající tabulka):
ALTER TABLE student ADD FOREIGN KEY (city_id) REFERENCES city(id);
Diskuse:
Je také možné přidat nový cizí klíč do existující tabulky. Zde je tabulka změněna pomocí ALTER TABLE
doložka. Název tabulky (v našem příkladu student
) je umístěn za ALTER TABLE
klíčové slovo. Dále ADD FOREIGN KEY
klauzule je následována názvem sloupce, který bude použit jako cizí klíč. Pak máme REFERENCES clause
s názvem odkazované tabulky a názvem sloupce primárního klíče v závorkách.
Pamatujte, že tabulka, kterou upravujete, musí před provedením tohoto příkazu existovat.
Řešení 6 (stávající tabulka, omezení cizího klíče):
ALTER TABLE student ADD CONSTRAINT fk_student_city_id FOREIGN KEY (city_id) REFERENCES city(id)
Diskuse:
Tento dotaz použijte, pokud chcete pojmenovat sloupec cizího klíče jako omezení pro existující tabulku. Zde se omezení cizího klíče jmenuje fk_student_city_id
. Pokud nezadáte název omezení, databáze vygeneruje výchozí název omezení (který se bude lišit podle databáze).