Primární a cizí klíč
Data máme rozdělená do tabulek. Teď potřebujeme dvě věci: poznat každý řádek a propojit tabulky mezi sebou. Na obojí slouží klíče.
Primární klíč
Primární klíč (primary key, zkráceně PK) je sloupec, jehož hodnota jednoznačně určuje řádek. Dva řádky v tabulce ho nesmí mít stejný a nesmí chybět.
Proč by nestačilo jméno zákazníka? Protože v každém větším e-shopu nakupuje víc Janů Nováků. A co e-mail? Ten je sice jedinečný, ale může se změnit, a s ním by se musel změnit i každý odkaz na zákazníka. Proto se jako primární klíč obvykle používá číslo id, které databáze přidělí sama a které nic dalšího neznamená.
Primární klíč si můžeme představit jako rodné číslo. Úřad podle něj člověka najde, i když se ve třídě sejdou dvě Jany Dvořákové. Tady nám ale analogie přestává fungovat: rodné číslo nese datum narození, kdežto dobrý klíč neříká o řádku nic. Kdyby nesl význam, musel by se měnit spolu s ním.
Cizí klíč
Objednávka patří zákazníkovi. Místo opisování jména a e-mailu si do objednávky uložíme jen id zákazníka:
orders
id | customer_id | created_at
-----+-------------+------------
101 | 1 | 2026-10-02
102 | 2 | 2026-10-05
103 | 1 | 2026-10-09Sloupec customer_id je cizí klíč (foreign key, FK). Ukazuje na primární klíč jiné tabulky. Z objednávky 103 zjistíme, že ji udělal zákazník 1, a jeho jméno i e-mail najdeme v tabulce customers. Alena je teď zapsaná jen jednou. Když změní e-mail, přepíšeme jeden řádek.
Tabulky budeme v textu i ve cvičeních zapisovat zkráceně, jen s názvy sloupců a klíči:
customers: id (PK), name, email, city
orders: id (PK), customer_id (FK → customers.id), created_atKlíče nejsou jen domluva mezi lidmi, databáze o nich ví. Při zakládání tabulky se zapíšou přímo do její definice:
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
customer_id INTEGER NOT NULL REFERENCES customers (id),
created_at DATE NOT NULL
);Jazyk SQL si projdeme v další lekci. Teď nám stačí vidět, že REFERENCES říká, kam cizí klíč ukazuje.
Referenční integrita
Co když se do tabulky dostane tahle objednávka?
104 | 7 | 2026-10-11Zákazník s id 7 neexistuje. Objednávka ukazuje do prázdna a nikdo nezjistí, komu ji poslat. Pravidlu, že každý cizí klíč musí ukazovat na existující řádek, se říká referenční integrita. Databáze ji hlídá ve dvou chvílích.
Při vložení je to jednoduché: objednávku pro neexistujícího zákazníka databáze odmítne.
Při smazání se musíme rozhodnout, co se stane s objednávkami zákazníka, kterého mažeme. Možnosti jsou tři a volí se při návrhu tabulky:
- Odmítnout smazání. Zákazníka s objednávkami smazat nejde. Je to výchozí chování.
- Smazat i objednávky (
ON DELETE CASCADE). Se zákazníkem zmizí všechno, co na něj odkazuje. - Vymazat odkaz (
ON DELETE SET NULL). Objednávky zůstanou, jen vcustomer_idbude prázdná hodnota.
Která možnost je správná, záleží na datech. V praxi se u objednávek kaskádovému mazání vyhýbá: jsou to podklady pro účetnictví a firma je musí několik let archivovat, i když zákazník zruší účet. Jak se databáze při mazání zachová, si vyzkoušíme v další lekci.