Vytvořte relace cizích klíčů
platí pro: SQL Server 2016 (13.x) a novější verze
Azure SQL Database
Azure SQL Managed Instance
SQL 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, zadejteNOT 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
aUPDATE
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
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.
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....)
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.Vyberte relaci v seznamu Vybraná relace.
Vyberte Specifikace tabulek a sloupců v mřížce napravo a vyberte trojtečku (...) napravo od vlastnosti.
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.
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.
Pokud chcete vytvořit relaci, zvolte OK.
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;