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