Jak vytvořit omezení cizího klíče v SQL

Pokud vlastníte podnik, musíte se ve svém podnikání setkat s hodnotou a potřebou dat. Mít prostředky pro ukládání a manipulaci s databázemi přidává podniku větší hodnotu.

Databáze jsou organizovány podle konkrétní konvence a umožňují vám strukturovat data ve spojeních, čímž se dostáváme k relačním databázím, které jsou jako forma správy dat přijímány od 70. let 20. století. A na dnešním trhu jsou preferovány relační databáze pro jejich schopnosti při manipulaci s daty.

I když existuje mnoho dostupných relačních databází, MySQL se dostalo na přední místo a podle Statista je od ledna 2022 světová dvojka.

Na serveru SQL jsou omezení předdefinovaná pravidla a omezení vynucená v jednom nebo více sloupcích; jsou svázány s hodnotami ve sloupci a pomáhají udržovat integritu, přesnost a spolehlivost dat zadaných sloupců.

Jednoduše řečeno, do sloupce se úspěšně vloží pouze data, která splňují omezující pravidlo. Operace vložení se ukončí, pokud data nesplňují kritéria.

Tento příspěvek předpokládá, že jste se setkali s relačními databázemi, konkrétně s MySQL, a těšíte se na posílení svých znalostí v doméně. Nakonec se podělím o několik tipů pro interakci s omezeními cizího klíče.

Primární klíčová omezení – rekapitulace

Tabulka v SQL zahrnuje sloupec nebo několik obsahující klíčové hodnoty, které přesně označují každý řádek v systémech. Sloupec nebo sloupce s názvem primární klíč (PK) tabulky mají roli vynucování integrity entity tabulky. Omezení primárního klíče zaručují jedinečná data a jsou často definována ve sloupci identity.

Po zadání omezení primárního klíče pro vaši tabulku databázový stroj automaticky stanoví jedinečnost dat generováním jedinečných indexů pro každý z primárních sloupců. Primární klíče nabízejí extrémní výhodu při použití v dotazech tím, že poskytují rychlý přístup k datům.

Pokud jsou omezení primárního klíče definována ve více sloupcích, označuje se jako složený nebo složený primární klíč. A v tomto případě může každý sloupec primárního klíče obsahovat duplicitní hodnoty. Kombinované hodnoty ze všech sloupců v primárním klíči však musí být jedinečné.

Dobrým příkladem je případ, kdy máte tabulku se sloupci `id`, `names` a `age`. Když definujete omezení primárního klíče na kombinaci „id“ a „names“, můžete mít duplicitní instance hodnot „id“ nebo „names“. Přesto musí být každá kombinace jedinečná, aby se předešlo duplicitním řádkům. Takže můžete mít záznamy s `id=1` a `jméno=Walter` a `věk-22 “a `id=1`, `name=Henry` a `age=27`, ale nemůžete mít jiné záznamy s `id=1` a `name=Walter`, protože kombinace není jedinečná.

Zde je několik základních aspektů, které je třeba znát:

  • Tabulka obsahuje pouze jedno omezení primárního klíče.
  • Primární klíče nesmí přesáhnout 16 sloupců a maximální délku 900 znaků.
  • Indexy generované primárními klíči mohou zvýšit indexy v tabulce. Počet seskupených indexů v tabulce však nemůže překročit 1 a počet neklastrovaných indexů v tabulce je omezen na 999.
  • Pokud pro klíčové omezení není specifikováno klastrované a neklastrované, klastrování se použije automaticky.
  • Všechny sloupce deklarované v rámci omezení primárního klíče by měly být definovány jako nenulové. Pokud tomu tak není, všechny sloupce propojené v podmínce mají možnost null roboticky nastavenou na not null.
  • Když jsou primární klíče definovány na uživatelem definovaném typu sloupce CLR (Common Language Runtime), implementace typu musí podporovat binární řazení.
  •   Jak deaktivovat UFW firewall v Linuxu

    Omezení cizích klíčů – přehled

    Cizí klíč (FK) zahrnuje sloupec nebo kombinaci několika sloupců používaných k vytvoření a svázání propojení mezi dvěma tabulkami a spravuje data, která mají být uložena v tabulce cizího klíče.

    Odkaz na cizí klíč znamená vytvoření spojení mezi dvěma tabulkami; když na sloupec nebo sloupce obsahující primární klíč pro jinou tabulku odkazuje sloupec nebo sloupce v jiné tabulce.

    Ve scénáři odkazu na cizí klíč se vytvoří spojení mezi dvěma tabulkami, když na sloupec nebo sloupce obsahující primární klíče v tabulce odkazují sloupce v jiné tabulce.

    V praktickém případě můžete mít tabulku Sales.SalesOrderHeader s cizím klíčem propojeným s jinou tabulkou Prodej.Osoba, protože mezi prodejci a prodejními objednávkami existuje logický vztah.

    Zde se SalesPersonID ve sloupci SalesOrderHeader mísí se sloupcem primárního klíče tabulky SalesPerson. Cizí klíč tabulky SalesPerson je sloupec SalesPersonID v SalesOrderHeader.

    Tento vztah definuje pravidlo: Hodnota SalesPersonID nemůže být ve vaší tabulce SalesOrderHeader, pokud v tabulce SalesPerson neexistuje.

    Tabulka může odkazovat až na 253 dalších sloupců a tabulek jako cizí klíče, alternativně nazývané odchozí odkazy. Od roku 2016 zvýšil SQL server počet tabulek a sloupců, na které můžete odkazovat v jedné tabulce, známé také jako příchozí odkazy, z 253 na 10 000. Tento nárůst však přichází s některými omezeními:

  • Odkazy na cizí klíč přesahující 253 jsou dostupné pouze pro operace DELETE DML. MERGE a UPDATE nejsou podporovány.
  • Tabulky s odkazy na cizí klíč na sebe mají maximálně 253 odkazů na cizí klíč.
  • Pro indexy úložiště sloupců, tabulky optimalizované pro paměť a tabulky dělených cizích klíčů jsou odkazy na cizí klíče omezeny na 253.
  • Jaké jsou výhody cizích klíčů?

    Jak již bylo zmíněno dříve, omezení cizího klíče hrají zásadní roli při zabezpečení integrity a konzistence dat v relační databázi. Zde je rozpis důvodů, proč jsou omezení cizích klíčů nezbytná.

  • Referenční integrita – Omezení cizího klíče zaručují, že každý záznam podřízené tabulky odpovídá záznamu primární tabulky, což zajišťuje konzistenci dat v obou tabulkách.
  • Prevence osamocených záznamů – Pokud odstraníte nadřazenou tabulku, omezení cizího klíče zajistí, že bude odstraněna i vaše přidružená podřízená tabulka, čímž se zabrání výskytu osamocených záznamů, které by mohly vést k nekonzistenci dat.
  • Vyšší výkon – Omezení cizích klíčů zvyšují výkon dotazů tím, že umožňují systému správy databází optimalizovat dotazy na základě vztahů mezi tabulkami.
  •   Opravte problémy se selháním ověřování Archeage

    Indexy omezení cizího klíče

    Omezení cizího klíče nevytváří automaticky odpovídající indexy jako primární. Můžete ručně vytvořit indexy pro omezení cizího klíče; je to výhodné z následujících důvodů.

    • Sloupce cizího klíče se často používají v kritériích spojení při kombinování dat ze souvisejících tabulek v dotazech pomocí přiřazování sloupců vázaných na omezení. Indexy pomáhají databázi najít přidružená data v cizí tabulce.
    • Pokud změníte omezení primárního klíče, budou zkontrolována s cizími v souvisejících tabulkách.

    Není povinné vytvářet indexy. Stále můžete kombinovat data ze dvou tabulek bez určení omezení primárního a cizího klíče. Přidání omezení cizího klíče však optimalizuje tabulky a kombinuje je v dotazu, který splňuje kritéria použití klíčů. Pokud změníte omezení primárního klíče, budou zkontrolována s cizími v souvisejících.

    Tipy pro vytvoření omezení cizího klíče v SQL

    Spekulacím jste již věnovali značný čas; odpověděl proč. Přesuňme své zaměření a zúžme jej na taktiku vytváření omezení cizích klíčů; odpovědět jak.

    Pole „Zahraniční klíč“ v tabulce odkazuje na „Primární klíč“ jiného klíče. Tabulka s primárním klíčem je vaše nadřazená tabulka. A tabulka s cizím klíčem se nazývá podřízená tabulka. Pojďme se ponořit.

    Vytvoření cizího klíče při vytváření tabulky

    Při vytváření tabulky můžete také vytvořit omezení cizího klíče pro zachování referenční integrity. Jak na to:

    CREATE TABLE orders (
        order_id INT PRIMARY KEY,
        customer_id INT,
        order_date DATE,
        FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
    );

    Výše uvedený kód vytvoří tabulku nazvanou ‚orders‘ s primárním celočíselným klíčem ‚order_id‘, dalším celým číslem ‚customer_id‘ a datem ‚order_date‘. V tomto případě je omezení FOREIGN KEY přidáno do sloupce ‚customer_id‘ a odkazuje na ‚customer_id‘ ve vaší tabulce ‚customers‘.

    Vytvoření cizího klíče po vytvoření tabulky

    Předpokládejme, že jste již vytvořili tabulku a chcete přidat omezení cizího klíče; použijte ve svém kódu příkaz `ALTER TABLE`. Podívejte se na fragment kódu níže.

    ALTER TABLE orders
    ADD FOREIGN KEY (customer_id) REFERENCES customers(customer_id);

    V tomto případě jste přidali omezení cizího klíče ‚customer_id‘ do tabulky ‚objednávky‘, abyste odkazovali na sloupec ‚customer_id‘ v tabulce ‚customers‘.

    Vytvoření cizího klíče bez kontroly existujících dat

    Když do tabulky přidáte omezení cizího klíče, databáze automaticky zkontroluje existující data, aby byla zajištěna konzistence s omezením. Pokud však víte, že data jsou konzistentní a chcete přidat omezení bez kontroly konzistence, postupujte takto.

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    NOT VALIDATE;

    Příkaz NOT VALIDATE říká databázi, aby nekontrolovala existující data. Tento konkrétní případ je užitečný v konkrétních případech. Například, když máte velká data a chcete dokončit proces ověření.

    Vytvoření cizího klíče pomocí DELETE/UPDATE

    Při vytváření omezení cizího klíče můžete řídit akci, která se má provést v případech, kdy je odkazovaný řádek aktualizován nebo odstraněn. V tomto případě používáte kaskádová omezení referenční integrity k diktování akcí, které mají být provedeny. Obsahují:

    #1. ŽÁDNÁ AKCE

    Stejně jako u mnoha jiných databází je pravidlo ‚NO ACTION‘ výchozím chováním při vytváření omezení cizího klíče. To znamená, že se při odstranění nebo aktualizaci odkazovaného řádku neprovede žádná akce.

      Jak vytvořit rychlou anketu v Microsoft Teams

    Database Engine vyvolá chybu, pokud je porušeno omezení cizího klíče. To se však nedoporučuje, protože to může vést k problémům s referenční integritou, protože je třeba vynutit omezení cizího klíče. Zde je příklad, jak na to:

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION;

    #2. KASKÁDA

    Pravidlo ‚CASCADE‘ je další možností pro akce ‚ON DELETE‘ a ‚ON UPDATE‘ při vytváření omezení cizího klíče. Když je zaveden, znamená to, že kdykoli je aktualizován nebo odstraněn řádek v nadřazených tabulkách, odpovídajícím způsobem se aktualizují nebo odstraní odkazované řádky. Tato technika je účinná při zachování referenční integrity. Zde je příklad:

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE CASCADE
    ON UPDATE CASCADE;

    Při používání tohoto pravidla byste měli být opatrní, protože může způsobit nežádoucí následky, pokud se nepoužívá opatrně. Měli byste se vyhnout náhodnému smazání příliš velkého množství dat nebo vytváření cyklických odkazů. Proto tuto možnost používejte pouze v případě potřeby a opatrně.

    Pro používání CASCADE platí určitá pravidla:

    • Nemůžete zadat CASCADE, pokud je sloupec časového razítka součástí cizího nebo odkazovaného klíče.
    • Pokud má vaše tabulka spouštěč INSTEAD OF DELETE, nemůžete zadat ON DELETED CASCADE.
    • Nemůžete zadat ON UPDATE CASCADE, pokud má vaše tabulka spouštěč MÍSTO AKTUALIZACE.

    #3. SET NULL

    Když odstraníte nebo aktualizujete odpovídající řádek v nadřazené tabulce, všechny hodnoty tvořící cizí klíč budou nastaveny na hodnotu null. Toto omezující pravidlo vyžaduje, aby sloupce cizího klíče mohly být spouštěny s možnou hodnotou Null, a nelze je zadat pro tabulky s aktivačními událostmi INSTEAD OF UPDATE. Zde je příklad, jak na to.

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE SET NULL
    ON UPDATE SET NULL

    V tomto případě jste nastavili sloupec cizího klíče ‚customer_id‘ v tabulce „objednávky“ na hodnotu null, pokud je odpovídající řádek v tabulce „customers“ odstraněn nebo aktualizován.

    #4. NASTAVIT VÝCHOZÍ

    Zde nastavujete všechny hodnoty, které činí cizí klíč výchozím za předpokladu, že je odkazovaný řádek v nadřazené tabulce aktualizován nebo odstraněn.

    Toto omezení se spustí, pokud mají všechny sloupce cizího klíče výchozí definice. Pokud má sloupec hodnotu null, jeho výchozí hodnota je nastavena na NULL. Všimněte si, že tuto volbu nelze zadat pro tabulky se spouštěči INSTEAD OF UPDATE. Zde je příklad:

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE SET DEFAULT
    ON UPDATE SET DEFAULT;

    Ve výše uvedeném případě jste nastavili ‚customer_id‘ v tabulce „objednávky“ na výchozí hodnotu, ke které dojde, když je odpovídající řádek v tabulce „zákazníci“ smazán nebo aktualizován.

    Závěrečná slova

    V této příručce jste si zopakovali omezení primárního klíče a zabrousili do omezení cizího klíče. Také jste se setkali s několika technikami vytváření omezení cizího klíče. A i když existuje mnoho způsobů, jak vytvořit omezení cizího klíče, tento příspěvek tyto metody odhalil.

    A doufat, že jste pochopili nové techniky; nejste omezeni na jejich kombinování. Například metody omezení CASCADE, SET NULL, SET DEFAULT a NO ACTION lze kombinovat na tabulkách s referenčními vztahy.

    Pokud vaše tabulka nenarazí na ŽÁDNOU AKCI, vrátí se k jiným omezujícím pravidlům. V ostatních případech může akce DELETE spustit kombinaci těchto pravidel a pravidlo NO ACTION bude spuštěno jako poslední.

    Dále se podívejte na cheat sheet SQL.