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
editovat[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
editovatJako 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
editovatV databázi spolku přátel psů máme následující tabulky:
osoby
se sloupciosoba_id
ajméno
psi
se sloupcipes_id
,majitel
arasa
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
editovatExterní odkazy
editovat- (anglicky) Foreign Key Constraints Archivováno 31. 10. 2005 na Wayback Machine. – popis implementace cizích klíčů v databázi MySQL
- (anglicky) FOREIGN KEY Constraints – popis implementace cizích klíčů v databázi Microsoft SQL Server