Cizí klíč

Cizí klíč (FOREIGN KEY) definuje v prostředí relačních databází vztah mezi dvěma tabulkami, a to tak, že hodnota v určeném sloupci jedné tabulky musí existovat v jiném (primárním) klíči. Tím je definováno integritní omezení, které do položky v tabulce umožní vložit jen povolené hodnoty. Je tím vlastně vytvořeno spojení jednoho nebo více sloupců se sloupcem nebo více sloupci jiné („cizí“) tabulky. Tomu se též říká reference nebo odkaz.

Cizí klíč umožňuje definovat akce, které mají nastat při pokusu o změnu nebo mazání záznamů v cizí tabulce. Například po smazání záznamu z cizí tabulky budou ve zdrojové tabulce řádky s odpovídající hodnotou cizího klíče taktéž smazány nebo budou jejich odkazy nastaveny na určitou (neutrální) hodnotu nebo se smazání řádků v cizí tabulce zabrání. Omezení cizích klíčů tak představuje mechanismus pro udržení referenční integrity databáze.

Syntaxe 
[CONSTRAINT [název omezení]] FOREIGN KEY
    [název klíče] (název sloupce tabulky nebo jejich seznam oddělený čárkami)
    REFERENCES jméno_tabulky (název sloupce nebo jejich seznam oddělený čárkami)
    [ON DELETE akce]
    [ON UPDATE akce]
Definice cizího klíče platí jen v jednom směru – často se pro účely lepší představy „cizí“ tabulce říká rodičovská tabulka a tabulce, v níž se aplikují změny v závislosti na nastavení cizího klíče, dceřiná tabulka.

Akce 
Jako akce může být:
 CASCADE – pro klauzuli ON UPDATE se v dceřiné tabulce adekvátně změní odkazy na cizí klíč; v případě ON DELETE se záznamy odkazující na smazaný klíč smažou také. Většina vyspělejších databázových systémů umožňuje tuto akci aplikovat zřetězeně (pokud je nastaveno, že dceřiná tabulka je z hlediska cizího klíče současně rodičovskou tabulkou pro tabulku jinou atd.).
 SET DEFAULT – při změně nebo smazání rodičovského klíče se reference v dceřiné tabulce nastaví na hodnotu, kterou má definovanou jako výchozí
 SET NULL – jako SET DEFAULT, kde výchozí hodnotou je hodnota NULL
 RESTRICT – pokud v dceřiné tabulce existují záznamy odkazující na cizí klíč, pak odpovídající záznam v rodičovské tabulce nepůjde změnit nebo smazat (SŘBD tomu zabrání)
 NO ACTION – v konečném efektu stejné jako RESTRICT; rozdíly interpretace se liší podle jednotlivých databázových systémů: v některých akce NO ACTION na rozdíl od RESTRICT nehodí chybovou hlášku; v jiných implementacích se tyto dvě akce liší v „opožděnosti“, s kterou databázový systém cizí klíče kontroluje. Např. v případě MySQL se kontrola provádí implicitně, pokud není vypnuta direktivou SET FOREIGN_KEY_CHECKS = 0;.

Příklad 

V databázi spolku přátel psů máme následující tabulky:
 osoby se sloupci osoba_id a jméno
 psi se sloupci pes_id, majitel a rasa

Aby byla data v databázi korektní, je třeba, aby každý záznam psa měl uvedeného platného majitele. Proto označíme v tabulce psi sloupec majitel jako cizí klíč, vztažený k sloupci osoba_id v tabulce osoby. Když je poté přidán záznam pro psa, databázový engine bude vyžadovat, aby hodnota v poli majitel nabývala některé z existujících hodnot osoba_id tabulky osoby. Zároveň můžeme určit, zda se při smazání osoby smažou i záznamy všech psů, kterých je majitelem, nebo zda má pokus o smazání osoby vlastnící alespoň jednoho psa selhat.

Související články 
 SQL
 Relační databáze
 Referenční integrita

Externí odkazy 
  Foreign Key Constraints  – popis implementace cizích klíčů v databázi MySQL
  FOREIGN KEY Constraints – popis implementace cizích klíčů v databázi Microsoft SQL Server

Databáze

de:Schlüssel (Datenbank)#Fremdschlüssel
no:Nøkkel (database)#Fremmednøkkel
zh:关系键#外键