sql >> Databáze >  >> RDS >> Sqlserver

Vytvořte vztah v SQL Server 2017

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)

  1. Připojování (posunutí) a odebrání z pole JSON v PostgreSQL 9.5+

  2. Jak funguje SQLite Random()

  3. Enterprise Manager 11g FMW Control v R12.2

  4. Jak CONVERT() funguje v MariaDB