Naučte se, jak vytvořit vztah mezi dvěma tabulkami na SQL Server.
V návrhu relační databáze vztah je místo, kde jsou dvě nebo více tabulek propojeny, protože obsahují související data. To umožňuje uživatelům spouštět dotazy na související data ve více tabulkách.
Tato část kurzu vysvětluje, jak vytvořit následující vztahy:
V tomto diagramu jsou dva vztahy. Mezi Albums
existuje vztah a Artists
tabulky a mezi Albums
existuje další vztah a Genres
tabulky.
Když se podíváme na tento diagram, můžeme vidět, že jeden umělec může mít mnoho alb. V tomto případě potřebujeme mít pouze jeden řádek, který obsahuje jméno interpreta, bez ohledu na to, kolik alb má. Je to proto, že můžeme vytvořit záznam v Artists
tabulka s jedinečným ArtistId
. Všechna alba daného interpreta budou umístěna v Albums
tabulky a budou obsahovat stejné ID interpreta ve vlastním ArtistId
sloupec. Tímto způsobem můžeme spustit dotaz v obou tabulkách a vrátit jméno interpreta a všechna alba, která vydali. To je výhoda vztahů.
Dříve jsme vytvořili databázi obsahující výše uvedené tři tabulky. Když jsme to udělali, vytvořili jsme také jeden ze vztahů znázorněných na výše uvedeném diagramu. Vytvořili jsme vztah mezi Albums
tabulka a Artists
tabulka (kde ArtistId
ve sloupci Albums
tabulka odkazuje na ArtistsId
ve sloupci Artists
tabulka).
Zde je kód, který jsme spustili k vytvoření tabulek:
Zvýrazněný kód je část, která vytváří vztah mezi Albums
tabulka a Artists
stůl. Dělá to nastavením ArtistId
ve sloupci Albums
odkazovat na ArtistId
ve sloupci Artists
tabulka.
Techničtější způsob, jak to říci, je Albums.ArtistId
se stane cizím klíčem Artists.ArtistId
(což je samo o sobě primární klíč této tabulky). Toto je omezení cizího klíče.
Co je to omezení cizího klíče?
omezení cizího klíče definuje vztah mezi touto tabulkou a jinou tabulkou. Když vytvoříte omezení cizího klíče, vytvoříte jej proti konkrétnímu sloupci v podřízeném tabulky, chcete-li odkazovat na konkrétní sloupec v nadřazeném tabulka.
Díky tomu je sloupec v podřízené tabulce cizí klíč . Omezení zajišťuje, že jakákoli hodnota, která jde do tohoto sloupce (cizí klíč), odpovídá hodnotě ve sloupci primárního klíče nadřazené tabulky. Pokud se někdo pokusí zadat hodnotu, která neodpovídá hodnotě ve sloupci primárního klíče nadřazené tabulky, SQL Server vyvolá chybu.
To pomáhá vynutit referenční integritu. Brání nám to mít osiřelé záznamy (podřízené záznamy, které nemají rodiče). Nebo v našem příkladu alba, která nejsou spojena s žádným interpretem.
Pokud používáte nástroj pro správu databází GUI, jako je SSMS nebo Azure Data Studio, vztah se zobrazí pod Keys
uzel pro tabulku s cizím klíčem:
Pojďme dekonstruovat kód:
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId) REFERENCES dbo.Artists (ArtistId) ON DELETE NO ACTION ON UPDATE NO ACTION
První dva řádky vytvářejí vztah. Vytvářejí omezení cizího klíče mezi
Albums.ArtistId
a
Artists.ArtistId
sloupec. V tomto případě nazýváme omezení cizího klíče FK_Albums_Artists
.
Poslední dva řádky určují, co má SQL Server udělat, pokud se někdo pokusí odstranit nebo aktualizovat nadřazený záznam, na který odkazuje záznam v podřízené tabulce. V tomto případě NO ACTION
znamená, že smazání/aktualizace nebude pokračovat. Uživatel pouze dostane chybu.
Můžete to změnit na ON DELETE CASCADE
pokud chcete mít možnost odstranit rodiče a potomka najednou (tj. odstranění bude probíhat kaskádově od rodiče k potomkovi). Stejná logika platí pro aktualizace pomocí ON UPDATE CASADE
.
NO ACTION
je výchozí hodnota, takže jsme se mohli obejít bez posledních dvou řádků kódu. Nicméně jsem to zahrnul, protože je to důležitý faktor, na který je třeba myslet při vytváření omezení cizího klíče.
Přidat vztah ke stávající tabulce
Předchozí příklad vytvoří vztah současně s vytvořením tabulek. Mohou však nastat situace, kdy budete potřebovat přidat vztah k existující tabulce.
Pojďme přidat nový vztah mezi Genres
a Albums
tabulky.
Spusťte následující kód:
USE Music; ALTER TABLE Albums ADD CONSTRAINT FK_Albums_Genres FOREIGN KEY (GenreId) REFERENCES dbo.Genres (GenreId) ON DELETE NO ACTION ON UPDATE NO ACTION ;
Tím se vytvoří nový cizí klíč v Albums
stůl. Výsledkem je Albums.GenreId
stát se cizím klíčem, který odkazuje na Genres.GenreId
.
Spuštění tohoto příkazu má za následek zobrazení nového cizího klíče pod Klíče uzel:
Cizí klíče s jedním sloupcem
Cizí klíče pro jeden sloupec (jako ten výše) lze také zadat na úrovni sloupce. Takže další způsob vytváření Albums
tabulka a její cizí klíč je takto:
CREATE TABLE Albums ( AlbumId int IDENTITY(1,1) NOT NULL PRIMARY KEY, AlbumName nvarchar(255) NOT NULL, ReleaseDate date NOT NULL, ArtistId int NOT NULL REFERENCES Artists(ArtistId), GenreId int NOT NULL );
Tuto metodu nelze použít na omezení klíče s více sloupci, takže pro ně použijte syntaxi z původního příkladu výše.
Vícesloupcové cizí klíče
Cizí klíč s více sloupci je tam, kde se pro cizí klíč používá více než jeden sloupec. To se obvykle používá, když nadřazená tabulka používá pro svůj primární klíč více sloupců. K tomu může dojít, pokud nadřazená tabulka kombinuje hodnoty ze dvou sloupců a vytváří jedinečnou hodnotu.
Vícesloupcové cizí klíče lze vytvořit pomocí syntaxe v původním příkladu výše. Stačí přidat každý název sloupce oddělený čárkou.
Pokud si tedy představíme, že Albums
tabulka má také ArtistName
sloupec (a že Artists
tabulka používá ArtistId
a ArtistName
jako primární klíč) by vícesloupcový cizí klíč vypadal takto:
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId, ArtistName) REFERENCES dbo.Artists (ArtistId, ArtistName)