Cizí klíče
V první lekci jste cizí klíče sledovali ručně: zakaznik_id objednávky je id zákazníka. Cizí klíč je sloupec, jehož hodnoty jsou primární klíče jiné tabulky. Když tabulku vytváříte, označíte ho slovem REFERENCES (odkazuje na), za kterým následuje tabulka a sloupec, na který ukazuje. Třeba poznámky podpory obchodu o zákaznících:
CREATE TABLE poznamky (
id INTEGER PRIMARY KEY,
zakaznik_id INTEGER NOT NULL REFERENCES zakaznici (id),
poznamka TEXT NOT NULL
) STRICT;Od teď databáze hlídá, aby každé zakaznik_id v tabulce bylo id zákazníka, který existuje. Poznámka o zákaznici 3 projde; poznámku o zákazníkovi 99, který neexistuje, databáze odmítne:
INSERT INTO poznamky (zakaznik_id, poznamka)
VALUES (3, 'Má ráda logické hry.');
INSERT INTO poznamky (zakaznik_id, poznamka)
VALUES (99, 'Ptal se na vrácení peněz.');Error on line 4: FOREIGN KEY constraint failedNa rozdíl od ostatních zpráv tahle neříká, který sloupec je špatně, takže hodnotu, která ukazuje do prázdna, musíte najít sami. NULL cizí klíč obsahovat smí, pokud sloupec nemá NOT NULL: neukazuje pak nikam, jako doporucil zákazníka, kterému obchod nikdo nedoporučil.
Kontrola funguje i opačně. V minulé lekci jste viděli, že hru, která má objednávky, smazat nejde: ukazují na ni řádky tabulky polozky. Díky tomu žádný řádek nikdy neukazuje na něco, co neexistuje. Pokud chcete, aby se řádky, které na smazaný řádek ukazují, smazaly s ním, napište za REFERENCES zakaznici (id) ještě ON DELETE CASCADE. Používejte to opatrně, jen pro řádky, které samy o sobě nedávají smysl.
Cizí klíč má typ sloupce, na který ukazuje, tady INTEGER, a jeho název obvykle říká, kam ukazuje: tabulka v jednotném čísle a _id, jako zakaznik_id nebo hra_id. Můžete potkat i cizí klíč zapsaný za posledním sloupcem jako FOREIGN KEY (zakaznik_id) REFERENCES zakaznici (id); znamená totéž.
SQLite kontroluje cizí klíče, jen když se mu to řekne příkazem PRAGMA foreign_keys = ON. Tento kurz to za vás udělá před každým spuštěním; jiné databáze je kontrolují vždycky. A nová tabulka se neobjeví na kartě Tabulky, která ukazuje jen tabulky, se kterými obchod začíná.
Typická chyba: překlep v tabulce za REFERENCES. CREATE TABLE ji nekontroluje, takže se chyba ukáže až při prvním INSERT:
CREATE TABLE poznamky (
id INTEGER PRIMARY KEY,
zakaznik_id INTEGER NOT NULL REFERENCES zakaznik (id),
poznamka TEXT NOT NULL
) STRICT;
INSERT INTO poznamky (zakaznik_id, poznamka)
VALUES (3, 'Má ráda logické hry.');Error on line 7: no such table: main.zakaznikJak psát:
Pokyny
Obchod začne prodávat rozšíření (DLC) ke svým hrám. Vytvořte tabulku rozsireni (STRICT) s těmito sloupci v tomto pořadí:
id– celočíselný primární klíč,hra_id– hra, ke které rozšíření patří: celé číslo, vždycky vyplněné, a cizí klíč do tabulkyhry,nazev– text, vždycky vyplněný,cena– celé číslo, vždycky vyplněné.
Vložte tři rozšíření: Ice Caves k Dragon Forge za 249 Kč, Dragon Riders k Dragon Forge za 399 Kč a Night Tracks k Turbo Karts za 129 Kč. ID her najdete na kartě Tabulky. Pak ukažte celou tabulku rozsireni seřazenou podle id:
| id | hra_id | nazev | cena |
|---|---|---|---|
| 1 | 1 | Ice Caves | 249 |
| 2 | 1 | Dragon Riders | 399 |
| 3 | 14 | Night Tracks | 129 |
Přidejte dotaz, který ukáže každé rozšíření s názvem jeho hry, ve sloupcích hra (název hry), rozsireni (název rozšíření) a cena, seřazené podle ceny:
| hra | rozsireni | cena |
|---|---|---|
| Turbo Karts | Night Tracks | 129 |
| Dragon Forge | Ice Caves | 249 |
| Dragon Forge | Dragon Riders | 399 |
Začněte programovat zdarma
6/10