Cizí klíč SQL Serveru: Jak ho vytvořit pomocí příkladu

⚡ Chytré shrnutí

Cizí klíč v SQL Serveru vynucuje referenční integritu propojením podřízené tabulky s nadřazenou tabulkou. Každá hodnota cizího klíče musí již existovat v odkazovaném primárním klíči nadřazené tabulky.

  • 🔗 Co je to cizí klíč: Cizí klíč propojuje podřízenou tabulku s nadřazenou tabulkou a vynucuje referenční integritu mezi nimi.
  • 👪 Rodič a dítě: Odkazovaná tabulka je rodičovská tabulka; tabulka obsahující cizí klíč je potomek, který ukazuje na primární klíč rodiče.
  • 🖱️ Dvě metody tvorby: Relace v SQL Server Management Studio a klauzule T-SQL CREATE TABLE … FOREIGN KEY … REFERENCES definují cizí klíč.
  • Přidat do existující tabulky: ZMĚNIT TABULKU … PŘIDAT OMEZENÍ … FOREIGN KEY přidá relaci k tabulce, která již existuje.
  • 🔄 Referenční akce: Klauzule ON DELETE a ON UPDATE řídí podřízené řádky s NO ACTION, CASCADE, SET NULL nebo SET DEFAULT.
  • (Tj. Integrity zkontrolovat: Vložení podřízeného řádku, jehož klíč nemá odpovídající nadřazený řádek, je odmítnuto, keeping data konzistentní.

SQL Server FOREIGN KLÍČ: Jak vytvořit v SQL Serveru s příkladem

Co je CIZÍ KLÍČ?

Cizí klíč poskytuje způsob, jak vynutit referenční integritu v rámci SQL ServerJednoduše řečeno, cizí klíč zajišťuje, že hodnoty z jedné tabulky musí být přítomny i v jiné tabulce.

Pravidla pro ZAHRANIČNÍ KLÍČ

  • V cizím klíči SQL je povolena hodnota NULL.
  • Tabulka, na kterou se odkazuje, se nazývá nadřazená tabulka.
  • Tabulka s cizím klíčem se nazývá podřízená tabulka.
  • Cizí klíč v podřízené tabulce odkazuje na primární klíč v nadřazené tabulce.
  • Tento vztah rodič-dítě vynucuje pravidlo známé jako „referenční integrita“.

Níže uvedený diagram shrnuje všechny výše uvedené body pro cizí klíč.

Schéma cizího klíče propojujícího podřízenou tabulku s primárním klíčem nadřazené tabulky

Jak vytvořit CIZÍ KLÍČ v SQL

Cizí klíč v SQL Serveru můžete vytvořit dvěma způsoby:

SQL Server Management Studio

Nadřazená tabulka: Řekněme, že máme existující nadřazenou tabulku s názvem „Kurz“. ID_kurzu a název_kurzu jsou dva sloupce, přičemž ID_kurzu je primárním klíčem.

Nadřazená tabulka Course s primárním klíčem Course_Id a sloupci Course_name

Podřízená tabulka: Potřebujeme vytvořit druhou tabulku jako podřízenou tabulku. Jejími dva sloupce jsou „Course_ID“ a „Course_Strength“. „Course_ID“ by však měl být cizí klíč.

Krok 1) Klikněte pravým tlačítkem myši na Tabulky > Nová > Tabulka…

V SQL Server Management Studio klikněte pravým tlačítkem myši na Tabulky, poté na Nový a poté na Tabulka.

Krok 2) Zadejte dva názvy sloupců: „Course_ID“ a „Course_Strength“. Klikněte pravým tlačítkem myši na sloupec „Course_Id“ a poté klikněte na Vztah.

Nové sloupce podřízené tabulky Course_ID a Course_Strength s nabídkou Relationship

Krok 3) V části „Vztahy cizích klíčů“ klikněte na tlačítko „Přidat“.

Dialogové okno Vztahy cizích klíčů s tlačítkem Přidat

Krok 4) V části „Specifikace tabulek a sloupců“ klikněte na ikonu „…“.

Pole Specifikace tabulek a sloupců s tlačítkem se třemi tečkami

Krok 5) V rozbalovací nabídce vyberte „Tabulku primárních klíčů“ jako „KURZ“ a nově vytvářenou tabulku jako „Tabulku cizích klíčů“.

Výběr COURSE jako tabulky primárních klíčů v dialogovém okně relací

Krok 6) V části „Tabulka primárních klíčů“ vyberte jako sloupec tabulky primárních klíčů sloupec „Id_kurzu“.

V části „Tabulka cizích klíčů“ vyberte jako sloupec tabulky cizích klíčů sloupec „Id_kurzu“. Klikněte na OK.

Mapaping Course_Id jako sloupce primárního klíče i cizího klíče

Krok 7) Klikněte na tlačítko Přidat.

Kliknutím na tlačítko Přidat potvrďte vztah cizího klíče

Krok 8) Zadejte název tabulky jako „Course_Strength“ a klikněte na OK.

Pojmenování podřízené tabulky Course_Strength a kliknutí na OK

Výsledek: Nastavili jsme vztah rodič-dítě mezi 'Kurz' a 'Síla_kurzu'.

Vztah rodič-dítě mezi kurzem a kurzem Course_Strength

T-SQL: Vytvoření tabulky typu rodič-potomek pomocí T-SQL

Nadřazená tabulka: Znovu zvažte, že máme existující nadřazenou tabulku s názvem „Kurz“. ID_kurzu a název_kurzu jsou dva sloupce, přičemž ID_kurzu je primárním klíčem.

Existující nadřazená tabulka Course s primárním klíčem Course_Id

Podřízená tabulka: Potřebujeme vytvořit druhou tabulku jako podřízenou tabulku s názvem 'Course_Strength_TSQL'. Jejími dvěma sloupci jsou 'Course_ID' a 'Course_Strength'. 'Course_ID' by však měl být cizí klíč.

Níže je uvedena syntaxe pro vytvořit tabulku s CIZÍM KLÍČEM.

Syntaxe:

CREATE TABLE childTable
(
  column_1 datatype [ NULL |NOT NULL ],
  column_2 datatype [ NULL |NOT NULL ],
  ...

  CONSTRAINT fkey_name
    FOREIGN KEY (child_column1, child_column2, ... child_column_n)
    REFERENCES parentTable (parent_column1, parent_column2, ... parent_column_n)
    [ ON DELETE { NO ACTION |CASCADE |SET NULL |SET DEFAULT } ]
    [ ON UPDATE { NO ACTION |CASCADE |SET NULL |SET DEFAULT } ] 
);

Zde je popis výše uvedených parametrů:

  • childTable je název tabulky, která má být vytvořena.
  • column_1, column_2 jsou sloupce, které mají být přidány do tabulky.
  • fkey_name je název omezení cizího klíče, které má být vytvořeno.
  • child_column1, child_column2 … child_column_n jsou sloupce podřízené tabulky, které odkazují na primární klíč v nadřazené tabulce (parentTable).
  • parentTable je název nadřazené tabulky, na jejíž klíč se odkazuje v podřízené tabulce.
  • nadřazený_sloupec1, nadřazený_sloupec2 … nadřazený_sloupec_n jsou sloupce tvořící primární klíč nadřazené tabulky.
  • ON DELETE je volitelný parametr, který určuje, co se stane s podřízenými daty po odstranění nadřazených dat. Mezi hodnoty patří NO ACTION, SET NULL, CASCADE nebo SET DEFAULT.
  • ON UPDATE je volitelný parametr, který určuje, co se stane s podřízenými daty po aktualizaci nadřazených dat. Hodnoty zahrnují NO ACTION, SET NULL, CASCADE nebo SET DEFAULT.
  • ŽÁDNÁ AKCE znamená, že se s podřízenými daty po aktualizaci nebo odstranění nadřazených dat nic nestane.
  • CASCADE znamená, že podřízená data jsou odstraněna nebo aktualizována po odstranění nebo aktualizaci nadřazených dat.
  • SET NULL znamená, že podřízená data se po aktualizaci nebo odstranění nadřazených dat nastaví na hodnotu null.
  • SET DEFAULT znamená, že podřízená data se po aktualizaci nebo smazání nadřazených dat nastaví na výchozí hodnotu.

Podívejme se na příklad cizího klíče, který vytvoří tabulku s jedním sloupcem jako CIZI KLÍČ, a to pomocí datový typ pro každý sloupec.

Cizí klíč v příkladu SQL

Dotaz:

CREATE TABLE Course_Strength_TSQL
(
Course_ID Int,
Course_Strength Varchar(20) 
CONSTRAINT FK FOREIGN KEY (Course_ID)
REFERENCES COURSE (Course_ID)	
)

Krok 1) Spusťte dotaz kliknutím na tlačítko Spustit.

Spuštění dotazu CREATE TABLE, který definuje cizí klíč Course_ID

Výsledek: Nastavili jsme vztah rodič-dítě mezi 'Course' a 'Course_Strength_TSQL'.

Vztah rodič-dítě vytvořen mezi kurzem Course a Course_Strength_TSQL

Pomocí ALTER TABLE

Nyní se naučíme, jak přidat cizí klíč v SQL Serveru do již existující tabulky pomocí příkazu ALTER TABLE. Použijeme k tomu níže uvedenou syntaxi:

ALTER TABLE childTable
ADD CONSTRAINT fkey_name
    FOREIGN KEY (child_column1, child_column2, ... child_column_n)
    REFERENCES parentTable (parent_column1, parent_column2, ... parent_column_n);

Zde je popis výše použitých parametrů:

  • childTable je název tabulky, která má být vytvořena.
  • column_1, column_2 jsou sloupce, které mají být přidány do tabulky.
  • fkey_name je název omezení cizího klíče, které má být vytvořeno.
  • child_column1, child_column2 … child_column_n jsou sloupce podřízené tabulky, které odkazují na primární klíč v nadřazené tabulce (parentTable).
  • parentTable je název nadřazené tabulky, na jejíž klíč se odkazuje v podřízené tabulce.
  • nadřazený_sloupec1, nadřazený_sloupec2 … nadřazený_sloupec_n jsou sloupce tvořící primární klíč nadřazené tabulky.

Příklad přidání cizího klíče příkazem ALTER TABLE:

ALTER TABLE department
ADD CONSTRAINT fkey_student_admission
    FOREIGN KEY (admission)
    REFERENCES students (admission);

Na stole oddělení jsme vytvořili cizí klíč s názvem fkey_student_admission. Tento cizí klíč odkazuje na sloupec přijetí v tabulce studentů.

Příklad dotazu CIZÍ KLÍČ

Nejprve se podívejme na data z naší nadřazené tabulky, SAMOZŘEJMĚ.

Dotaz:

SELECT * from COURSE;

Výsledek SELECT zobrazující data nadřazené tabulky COURSE

Nyní vložme několik řádků do podřízené tabulky 'Course_Strength_TSQL'. Zkusíme vložit dva typy řádků:

  • První typ, pro který existuje Course_Id v podřízené tabulce v Course_Id nadřazené tabulky, tj. Course_Id = 1 a 2.
  • Druhý typ, pro který Course_Id v podřízené tabulce neexistuje v Course_Id nadřazené tabulky, tj. Course_Id = 5.

Dotaz:

Insert into COURSE_STRENGTH values (1,'SQL');
Insert into COURSE_STRENGTH values (2,'Python');
Insert into COURSE_STRENGTH values (5,'PERL');

Vkládání podřízených řádků, včetně Course_ID 5, který nemá odpovídající rodičovský řádek

Výsledek: Spusťme dotaz společně, abychom viděli nadřazené a podřízené tabulky.

Řádky s Course_ID 1 a 2 existují v tabulce Course_Strength. Course_ID 5 je však výjimkou, protože v nadřazené tabulce nemá žádný odpovídající řádek.

Porovnání nadřazených a podřízených tabulek; Course_ID 5 porušuje referenční integritu.

Nejčastější dotazy

Primární klíč jednoznačně identifikuje každý řádek ve vlastní tabulce a nemůže mít hodnotu NULL. Cizí klíč odkazuje na tento primární klíč z jiné tabulky, aby se vynutila referenční integrita. primární klíč versus cizí klíč srovnání vysvětluje každý rozdíl.

Ano. Cizí klíč může odkazovat buď na primární klíč, nebo na jakýkoli sloupec, který nese omezení UNIQUE v nadřazené tabulce. Odkazovaný sloupec musí obsahovat jedinečné hodnoty, aby každý podřízený řádek odpovídal přesně jednomu nadřazenému řádku.

ON DELETE CASCADE automaticky odstraní odpovídající podřízené řádky vždy, když je odstraněn jejich nadřazený řádek, keeping tabulky konzistentní. Alternativami jsou SET NULL, který vymaže podřízený cizí klíč, a NO ACTION, který blokuje odstranění.

Ano. Samoodkazující cizí klíč odkazuje na primární klíč ve stejné tabulce, která modeluje hierarchie, jako například řádek zaměstnance odkazující na svého manažera. Pro samoodkazy SQL Server doporučuje ON DELETE NO ACTION, aby se zabránilo kaskádovým cyklům.

Ano, pokud není sloupec deklarován jako NOT NULL. Cizí klíč s hodnotou NULL znamená, že podřízený řádek ještě není propojen s žádným nadřazeným řádkem a SQL Server přeskočí referenční kontrolu pro tuto hodnotu NULL.

Spusťte příkaz ALTER TABLE child_table DROP CONSTRAINT fkey_name. Musíte zadat název omezení, který najdete v souboru sys.foreign_keys. Dropping Cizí klíč odstraní vztah, ale ponechá obě tabulky a jejich data beze změny.

Ano. GitHub Copilot Můžete zapisovat omezení typu FOREIGN KEY uvnitř příkazů CREATE TABLE nebo ALTER TABLE z příkazového řádku v přirozeném jazyce a navrhovat nadřazenou tabulku a odkazovaný sloupec. Před spuštěním skriptu vždy zkontrolujte klíče, referenční akce a datové typy.

Nástroje umělé inteligence a strojového učení zkoumají vzorová data a vzory dotazů, aby navrhly, které sloupce by se měly stát cizími klíči, detekovaly chybějící nebo osiřelé vztahy a doporučily vhodné akce ON DELETE. Vývojář každý návrh před jeho použitím zkontroluje.

Shrňte tento příspěvek takto: