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 failed

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

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 tabulky hry,
  • 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:

idhra_idnazevcena
11Ice Caves249
21Dragon Riders399
314Night Tracks129

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:

hrarozsirenicena
Turbo KartsNight Tracks129
Dragon ForgeIce Caves249
Dragon ForgeDragon Riders399

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

6/10