Sdílet prostřednictvím


Vytvořte relace cizích klíčů

platí pro: SQL Server 2016 (13.x) a novější verze Azure SQL DatabaseAzure SQL Managed InstanceSQL Database v Microsoft Fabric

Tento článek popisuje, jak vytvořit vztahy cizích klíčů v SQL Serveru pomocí nástroje SQL Server Management Studio nebo Transact-SQL. Relaci mezi dvěma tabulkami vytvoříte, když chcete přidružit řádky jedné tabulky k řádkům druhé.

Dovolení

Vytvoření nové tabulky s cizím klíčem vyžaduje oprávnění CREATE TABLE v databázi a oprávnění ALTER SCHEMA schématu, ve kterém se tabulka vytváří.

Vytvoření cizího klíče v existující tabulce vyžaduje ALTER TABLE oprávnění k tabulce.

Omezení

  • Omezení cizího klíče nemusí být propojené pouze s omezením primárního klíče v jiné tabulce. Cizí klíče lze také definovat tak, aby odkazovaly na sloupce omezení UNIQUE v jiné tabulce.

  • Pokud je do sloupce omezení NULL zadána jiná hodnota než FOREIGN KEY, musí hodnota existovat v odkazovaném sloupci. V opačném případě se vrátí chybová zpráva o porušení cizího klíče. Pokud chcete zajistit, aby byly ověřeny všechny hodnoty omezení složeného cizího klíče, zadejte NOT NULL pro všechny zúčastněné sloupce.

  • FOREIGN KEY omezení mohou odkazovat pouze na tabulky ve stejné databázi na stejném serveru. Referenční integrita mezi databázemi musí být implementována prostřednictvím triggerů. Další informace naleznete v tématu CREATE TRIGGER (Transact-SQL).

  • FOREIGN KEY omezení mohou odkazovat na jiný sloupec ve stejné tabulce a označují se jako samoreferenční omezení.

  • Omezení FOREIGN KEY zadané na úrovni sloupce může obsahovat pouze jeden referenční sloupec. Tento sloupec musí mít stejný datový typ jako sloupec, na kterém je definováno omezení.

  • Omezení FOREIGN KEY zadané na úrovni tabulky musí mít stejný počet sloupců odkazu jako počet sloupců v seznamu sloupců omezení. Datový typ každého referenčního sloupce musí být také stejný jako odpovídající sloupec v seznamu sloupců.

  • Databázový stroj nemá předdefinovaný limit na počet omezení FOREIGN KEY, která mohou být v tabulce, a která odkazují na jiné tabulky. Databázový stroj také neomezuje počet omezení FOREIGN KEY vlastněných jinými tabulkami, které odkazují na konkrétní tabulku. Skutečný počet použitých omezení FOREIGN KEY je však omezen konfigurací hardwaru a návrhem databáze a aplikace. Tabulka může odkazovat na maximálně 253 dalších tabulek a sloupců jako cizí klíče (odchozí odkazy). SQL Server 2016 (13.x) a novější verze zvyšují limit počtu dalších tabulek a sloupců, které můžou odkazovat na sloupce v jedné tabulce (příchozí odkazy), od 253 do 10 000. (Vyžaduje alespoň 130 úrovní kompatibility.) Zvýšení má následující omezení:

    • Pro operace DELETE a UPDATE DML se podporuje více než 253 odkazů na cizí klíč. MERGE operace nejsou podporovány.

    • Tabulka s odkazem na cizí klíč je stále omezena na 253 odkazů na cizí klíč.

    • Pro indexy columnstore nebo tabulky optimalizované pro paměť momentálně nejsou podporovány odkazy na cizí klíč, které jsou větší než 253.

  • Omezení FOREIGN KEY nejsou vynucována u dočasných tabulek.

  • Pokud je cizí klíč definován ve sloupci typu definovaném uživatelem CLR, musí implementace typu podporovat binární řazení. Další informace naleznete v tématu CLR User-Defined Types.

  • Sloupec typu varchar(max) se může účastnit omezení FOREIGN KEY pouze v případě, že primární klíč, na který odkazuje, je také definován jako typ varchar(max).

Vytvořte relaci cizího klíče v Návrháři tabulek

Použití aplikace SQL Server Management Studio

  1. V Průzkumníku objektů klikněte pravým tlačítkem myši na tabulku, která bude na straně relace s cizím klíčem, a vyberte Návrh.

    Tabulka se otevře v Vytvoření a aktualizace databázových tabulek.

  2. V nabídce Návrháře tabulky vyberte možnost Relace. (Podívejte se na nabídku Table Designer v záhlaví, nebo klikněte pravým tlačítkem na prázdné místo definice tabulky a vyberte Relace....)

  3. V dialogovém okně Relace cizího klíče vyberte Přidat.

    Relace se zobrazí v seznamu Vybraná relace s názvem zadaným systémem ve formátu FK_<tablename>_<tablename>, kde první název tabulky je tabulka cizího klíče a druhý název tabulky je tabulka primárního klíče. Toto je pouze výchozí a běžná konvence pojmenování pro pole (Název) objektu cizího klíče.

  4. Vyberte relaci v seznamu Vybraná relace.

  5. Vyberte Specifikace tabulek a sloupců v mřížce napravo a vyberte trojtečku (...) napravo od vlastnosti.

  6. V dialogovém okně Tabulky a sloupce vyberte v rozevíracím seznamu Primární klíč tabulku, která bude na straně primárního klíče v relaci.

  7. V mřížce pod dialogovým oknem zvolte sloupce, které přispívají k primárnímu klíči tabulky. V sousední buňce mřížky napravo od každého sloupce zvolte odpovídající sloupec cizího klíče v tabulce cizího klíče.

    Návrhář tabulky navrhne název relace. Chcete-li změnit tento název, upravte obsah textového pole Název relace.

  8. Pokud chcete vytvořit relaci, zvolte OK.

  9. Zavřete okno návrháře tabulky a uložte změny, aby se změna relace cizího klíče projevila.

Vytvoření cizího klíče v nové tabulce

Použití Transact-SQL

Následující příklad vytvoří tabulku a definuje omezení cizího klíče pro sloupec TempID, který odkazuje na sloupec SalesReasonID v tabulce Sales.SalesReason v databázi AdventureWorks. Klauzule ON DELETE CASCADE a ON UPDATE CASCADE slouží k zajištění automatického šíření změn Sales.SalesReason tabulky do tabulky Sales.TempSalesReason.

CREATE TABLE Sales.TempSalesReason (
    TempID INT NOT NULL,
    Name NVARCHAR(50),
    CONSTRAINT PK_TempSales
        PRIMARY KEY NONCLUSTERED (TempID),
    CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
        REFERENCES Sales.SalesReason(SalesReasonID)
    ON DELETE CASCADE
    ON UPDATE CASCADE
);

Vytvoření cizího klíče v existující tabulce

Použití Transact-SQL

Následující příklad vytvoří cizí klíč ve sloupci TempID a odkazuje na sloupec SalesReasonID v tabulce Sales.SalesReason v databázi AdventureWorks.

ALTER TABLE Sales.TempSalesReason
ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
REFERENCES Sales.SalesReason (SalesReasonID)
   ON DELETE CASCADE
   ON UPDATE CASCADE;