Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115 Číslo projektu:
CZ.1.07/1.5.00/34.0410
Číslo šablony:
V/2 - inovace směřující k rozvoji odborných kompetencí
Název materiálu:
Pracovní listy – Databáze
Ročník:
3. ročník (IT)
Identifikace materiálu:
BEL_52_DAT_PL21
Jméno autora:
Miloslav Bělský
Předmět:
Databáze
Tématický celek:
Integritní omezení - fk
Anotace:
Obsahem tohoto pracovního listu je využití integritních omezení - cizí klíč.
Datum:
15. 04. 2014
21-1
Databáze Pracovní list č. 21
Omezení CIZÍ KLÍČ (FOREIGN KEY) Cíl Pomocí vkládání cizích klíčů (FK) správně propojit tabulky dat. (Pro omezení se používá anglický termín CONSTRAINT.)
Výklad Cizí klíč je omezení, které nahrazuje vztah z ERD (Entity Relationship Diagram). Slouží k propojení dat jedné tabulky s jinou tabulkou, k vytvoření logické souvislosti. Například můžeme tabulku s CD medii propojit s tabulkou, která bude obsahovat seznam vydavatelů. Tím budeme moci ke každému CD přiřadit vydavatele, aniž bychom museli všechny jeho údaje vkládat přímo do tabulky s CD. Cizí klíč je možné vytvořit ihned při tvorbě struktury tabulky – CREATE TABLE, nebo dodatečně pomocí ALTER TABLE. Každý cizí klíč může mít dodatečné vlastnosti a je možné ho dočasně vypnout. Pokud potřebuje cizí klíč upravit, musíme jej smazat a vytvořit nový. Sloupec, na který odkazuje cizí klíč musí mít omezení primární klíč nebo unikátní klíč, aby byla zajištěna jedinečnost hodnot. V případě shodných hodnot by cizí klíč nemohl rozhodnout, na kterou hodnotu ukazovat. Vytvoření cizího klíče s tabulkou CREATE TABLE zamestnanci( id NUMBER(5) CONSTRAINT zam_pk PRIMARY KEY, prijmeni VARCHAR2(50) NOT NULL, jmeno VARCHAR2(50) NOT NULL, id_oddeleni NUMBER(5), CONSTRAINT zam_odd_fk FOREIGN KEY(id_oddeleni) REFERENCES oddeleni(id) ); Předchozí příklad ukazuje vložení cizího klíče do tabulky zaměstnanci (potomek). Cizí klíč ukazuje do tabulky oddeleni (rodič) na sloupec id. To znamená, že ke každému zaměstnanci můžeme vložit id oddělení, ve kterém pracuje. Tím je vytvořeno logické propojení mezi tabulkami. 21-2
Vytvoření cizího klíče dodatečně ALTER TABLE zaměstnanci ADD CONSTRAINT zam_odd_fk FOREIGN KEY(id_oddeleni) REFERENCES oddeleni(id); Syntaxe je prakticky stejná, jen následuje po příkazu ALTER TABLE ADD.
Zrušení cizího klíče Zrušení je možné provést několika způsoby: ALTER TABLE zaměstnanci DROP CONSTRAINT nazev; ALTER TABLE zaměstnanci DROP PRIMARY KEY; ALTER TABLE zaměstnanci DROP FOREIGN KEY nazev; Klauzule ON DELETE K cizímu klíči můžeme přidat podmínku, jak se má zachovat, když dojde k odstranění nebo úpravě řádku z rodičovské tabulky. Například, když odstraníme nějaké oddělení z tabulky oddeleni v uvedeném příkladu. Pokud neuvedeme jinak, tak nebude možné oddělení odstranit nebo upravit jeho id, dokud na něj odkazuje alespoň jeden řádek z tabulky potomka. Další možnosti: Přidáním ON DELETE CASCADE dojde k odstranění všech řádků potomka, které na smazaný záznam v rodiči ukazovali. Například všichni zaměstnanci smazaného oddělení budou odstraněny. Pokud přidáme ON DELETE SET NULL, dojde při smazání oddělení k nastavení hodnoty NULL u všech řádků v potomkovi. POZOR! Pokud máte v potomkovi na sloupci cizího klíče zároveň omezení NOT NULL, není možné klauzuli se SET NULL použít. Příklad použití: ALTER TABLE zaměstnanci ADD CONSTRAINT zam_odd_fk FOREIGN KEY(id_oddeleni) REFERENCES oddeleni(id) ON DELETE SET NULL;
21-3
Příklady k procvičení: Vytvářejte dotazy podle následujícího zadání. Pod každým úkolem je prostor na poznámky: 1. Vytvořte tabulku VYDAVATELE se sloupci id, nazev, ICO, adresa. a. Sloupec ID musí být PK, ostatní omezení volte podle sebe. Uvědomte si, proč musí být sloupec id primárním klíčem? b. Vložte několik řádek do tabulky VYDAVATELE. c. Do tabulky CD (z minulého pracovního listu č. 10) přidejte sloupec id_vydavatele a vložte cizí klíč, který bude odkazovat do tabulky VYDAVATELE. d. Vložte k jednotlivým CD konkrétní id vydavatele. e. Vypište všechna CD včetně názvu vydavatele. f. Pokuste se smazat některého vydavatele, na nějž existuje odkaz z tabulky CD.
2. Vytvořte tabulku PRISPEVKY se sloupci id, text, datum, id_uzivatele. Tato tabulka bude odkazovat na tabulku UZIVATELE z předchozího pracovního listu č. 10. a. Vložte potřebný cizí klíč, který tyto tabulky logicky propojí. Přidejte klauzuli ON DELETE SET NULL. b. Vložte několik záznamů do tabulky PRISPEVKY. c. Vypište příspěvky včetně jména uživatele. d. Vypište počty příspěvků jednotlivých uživatelů. e. Z tabulky UZIVATELE odstraňte jeden řádek (musí na něj odkazovat alespoň jeden příspěvek) a zkontrolujte změny v tabulce PRISPEVKY.
21-4
3. Vytvořte jednoduchou databázi, která bude evidovat výpůjčky knížek v knihovně. Budete potřebovat tabulky: CTENARI (id, jmeno, prijmeni, datum registrace), KNIHY (id, ISBN, nazev), AUTORI (id, jmeno, prijmeni), ZANRY (id, nazev), VYPUJCKY (sloupce vhodně zvolte). a. U všech tabulek zvolte vhodná omezení. b. Tabulky správně propojte cizími klíči a zvažte využití klauzule ON DELETE. c. Tabulky naplňte daty. d. Nakreslete ERD vaší databáze. e. Vypište: i. Seznam autorů s počtem jejich knih v knihovně. ii. Seznam čtenářů a jejich výpůjčky. iii. Seznam nevrácených výpůjček včetně jména čtenáře a jména knížky. iv. Vypište žebříček nejpůjčovanějších knih. v. *** Za každý den prodlení nad jeden měsíc se účtuje 10 Kč penále. Vypište výpůjčky se jmény čtenářů a výší pokuty. Pokud zatím žádná není, objeví se text „v pořádku“
21-5