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