TakéPKZákladní

Definice

Primární klíč je databázové omezení, které jednoznačně identifikuje každý řádek tabulky a nedovolí prázdnou ani duplicitní hodnotu. Slouží jako stabilní adresa záznamu pro dotazy, vazby mezi tabulkami i kontroly integrity. V relačních databázích bývá tvořen jedním sloupcem nebo kombinací více sloupců.

Kategorie: DatabázeAktualizováno

Proč tabulka potřebuje jednoznačnou identitu

Relační databáze ukládá data po řádcích, ale samotné pořadí řádků není spolehlivá identita. Primární klíč dává každému záznamu vlastní označení, podle kterého lze řádek přesně najít, upravit nebo propojit s jinými daty. Bez takového označení se rychle objeví nejasnost: má aktualizace změnit jednu konkrétní objednávku, nebo všechny objednávky stejného zákazníka ve stejný den?

Primární klíč není jen doporučení pro vývojáře. Databáze pravidlo vynucuje při zápisu dat. Pokus o vložení druhého řádku se stejnou hodnotou skončí chybou, stejně jako pokus uložit hodnotu prázdnou. Díky tomu může aplikace spoléhat na to, že odkaz na konkrétní řádek není dvojznačný.

Hodnoty, které primární klíč nesmí porušit

Primární klíč spojuje dvě vlastnosti: jedinečnost a nepřípustnost hodnoty NULL. Jedinečnost brání duplicitám, nepřípustnost prázdné hodnoty brání řádkům bez identity. Databázové systémy kvůli tomu obvykle vytvářejí interní index, aby bylo ověřování i vyhledávání podle klíče rychlé. Index ale není celý význam primárního klíče, je to spíš technický prostředek k prosazení pravidla.

Přirozený, umělý a složený primární klíč

Přirozený primární klíč vychází z dat samotných, například z katalogového čísla produktu. Umělý primární klíč vzniká jen pro databázi, typicky jako automaticky generované číslo nebo UUID. Složený primární klíč používá více sloupců najednou, například dvojici student_id a course_id v tabulce zápisů do kurzů.

Umělý klíč bývá praktický, když se významové údaje mohou měnit. E-mail zákazníka může být unikátní dnes, ale zákazník ho může později změnit. Stabilní technické ID se v takové situaci chová lépe jako dlouhodobý odkaz. Přirozený klíč má smysl tam, kde je hodnota opravdu neměnná a dobře řízená mimo aplikaci.

Vztah primárního klíče k cizím klíčům

Cizí klíč ukládá hodnotu, která odkazuje na primární klíč v jiné tabulce. Tabulka objednávek může mít primární klíč id a tabulka položek objednávky může obsahovat order_id. Databáze pak umí ověřit, že položka neukazuje na neexistující objednávku. Tento mechanismus je jedním ze základních nástrojů referenční integrity.

Normalizace databáze často vede k rozdělení dat do více tabulek. Primární klíče a cizí klíče potom drží rozdělený model pohromadě. Správná volba klíče proto neovlivňuje jen jednu tabulku, ale i budoucí migrace, auditní záznamy, API a importy dat.

Dopad na výkon a údržbu

Databázový engine podle primárního klíče často provádí nejčastější dotazy: načtení detailu uživatele, objednávky nebo dokumentu. Krátký a stabilní klíč snižuje velikost indexů a zjednodušuje odkazy z jiných tabulek. Nevhodně zvolený klíč může naopak prodražit změny, zvětšit všechny navazující indexy nebo nutit aplikaci řešit konflikty, kterým mohla zabránit databáze.

Primární klíč mimo klasické SQL

Dokumentové a key-value databáze používají podobnou myšlenku, ale pravidla se liší podle systému. MongoDB má pole _id, které jednoznačně identifikuje dokument v kolekci. Význam se podobá primárnímu klíči, ale datový model, transakce a vztahy mezi záznamy se nechovají stejně jako v relační databázi.

Příklady z praxe

  1. Objednávka a její položky

    E-shop uloží každou objednávku do tabulky orders s technickým ID jako primárním klíčem. Položky objednávky si uloží order_id, takže databáze pozná, ke které objednávce položka patří. Pokud aplikace zkusí vložit položku s neexistujícím order_id, cizí klíč zápis odmítne.

    CREATE TABLE orders (
      id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
      customer_email TEXT NOT NULL,
      created_at TIMESTAMP NOT NULL
    );
    
    CREATE TABLE order_items (
      id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
      order_id BIGINT NOT NULL REFERENCES orders(id),
      sku TEXT NOT NULL,
      quantity INTEGER NOT NULL
    );
  2. Zápis studenta do kurzu

    Univerzitní systém eviduje zápisy studentů do kurzů. Složený primární klíč říká, že stejný student může být ve více kurzech a stejný kurz může mít více studentů, ale stejná dvojice student a kurz nesmí vzniknout dvakrát. Opakovaný zápis stejného studenta do stejného kurzu skončí chybou místo tiché duplicity.

    CREATE TABLE course_enrollments (
      student_id BIGINT NOT NULL,
      course_id BIGINT NOT NULL,
      enrolled_at DATE NOT NULL,
      PRIMARY KEY (student_id, course_id)
    );

Časté omyly

MýtusPrimární klíč je totéž co index.
Ve skutečnostiPrimární klíč je pravidlo integrity: řádek musí mít jedinečnou a neprázdnou identitu. Index bývá způsob, jak databáze toto pravidlo rychle kontroluje, ale samotný index nemusí znamenat primární klíč.
MýtusJako primární klíč stačí použít e-mail uživatele, protože je unikátní.
Ve skutečnostiE-mail může být v určitém okamžiku unikátní, ale uživatel ho může změnit nebo se může změnit pravidlo domény. Stabilní technické ID bývá bezpečnější jako dlouhodobý odkaz mezi tabulkami.

Časté dotazy

Může mít jedna tabulka více primárních klíčů?
Tabulka má přesně jeden primární klíč jako databázové omezení, ale tento klíč může být složený z více sloupců. Složený primární klíč se používá například v propojovacích tabulkách, kde identitu řádku tvoří kombinace dvou cizích klíčů. Vedle primárního klíče může tabulka obsahovat další unikátní omezení, která hlídají jedinečnost e-mailu, kódu produktu nebo jiného údaje.
Má být primární klíč vidět uživatelům aplikace?
Primární klíč může být viditelný v URL nebo v administraci, pokud nejde o citlivý údaj a aplikace nekontroluje oprávnění jen podle jeho znalosti. Technické ID samo o sobě nemá být tajemství. Bezpečnost musí řešit autorizace: uživatel smí načíst jen záznamy, ke kterým má právo, i když uhodne nebo změní hodnotu ID v požadavku.
Je lepší použít UUID, nebo automaticky rostoucí číslo?
UUID jako primární klíč dává smysl u distribuovaných systémů, offline synchronizace nebo slučování dat z více zdrojů, protože hodnotu lze vytvořit bez centrální sekvence. Automaticky rostoucí číslo bývá kratší, přehlednější a často úspornější pro indexy. Volba závisí na požadavcích na generování ID, provozní architektuře a velikosti tabulek.
Může se hodnota primárního klíče později změnit?
Primární klíč se po vytvoření záznamu ideálně nemění, protože na jeho hodnotu často odkazují cizí klíče, logy, cache, API klienti nebo exporty. Změna je technicky možná, pokud databáze a aplikace správně aktualizují všechny odkazy, ale v praxi zvyšuje riziko chyb. Právě proto se pro dlouhodobou identitu často volí umělý stabilní klíč.

Zdroje

  1. 5.5. Constraints(otevře se v novém okně)PostgreSQL Global Development Group
  2. CREATE TABLE(otevře se v novém okně)SQLite
  3. Primary and foreign key constraints(otevře se v novém okně)Microsoft Learn
  4. Primary key(otevře se v novém okně)Wikipedia

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.