Научете как да създадете връзка между две таблици в SQL Server.
В дизайна на релационна база данни, връзка е мястото, където две или повече таблици са свързани заедно, защото съдържат свързани данни. Това позволява на потребителите да изпълняват заявки за свързани данни в множество таблици.
Тази част от урока обяснява как да създадете следните връзки:
![](http://www.sqldat.com/article/uploadfiles/202205/2022051111445453.gif)
В тази диаграма има две връзки. Има връзка между Albums
и Artists
таблици и има друга връзка между Albums
и Genres
таблици.
Като разгледаме тази диаграма, можем да видим, че един изпълнител може да има много албуми. В този случай трябва да имаме само един ред, който съдържа името на изпълнителя, независимо колко албума има. Това е така, защото можем да създадем запис в Artists
таблица с уникален ArtistId
. Всички албуми за този изпълнител ще се намират в Albums
таблица и те ще съдържат същия идентификатор на изпълнител в своя собствен ArtistId
колона. По този начин можем да изпълним заявка в двете таблици и да върнем името на изпълнителя, плюс всички албуми, които са издали. Това е ползата от взаимоотношенията.
По-рано създадохме база данни, съдържаща горните три таблици. Когато направихме това, създадохме и една от връзките, изобразени на горната диаграма. Създадохме връзката между Albums
таблицата и Artists
таблица (където ArtistId
колона на Albums
таблицата препраща към ArtistsId
колона на Artists
таблица).
Ето кода, който изпълнихме, за да създадем таблиците:
![](http://www.sqldat.com/article/uploadfiles/202205/2022051111445469.gif)
Маркираният код е частта, която създава връзка между Albums
таблицата и Artists
маса. Прави това, като задава ArtistId
колона на Albums
за справка с ArtistId
колона на Artists
таблица.
По-технически начин да се каже това е Albums.ArtistId
става външен ключ на Artists.ArtistId
(който сам по себе си е първичният ключ на тази таблица). Това е ограничение за външен ключ.
Какво е ограничение за външен ключ?
Ограничение за външен ключ дефинира връзка между тази таблица и друга таблица. Когато създавате ограничение за външен ключ, вие го създавате срещу конкретна колона в дъщето таблица, за да посочите конкретна колона в родител таблица.
Това прави тази колона в дъщерната таблица външен ключ . Ограничението гарантира, че всяка стойност, която влиза в тази колона (външен ключ), съответства на стойност в колоната с първичен ключ на родителската таблица. Ако някой се опита да въведе стойност, която не съответства на стойност в колоната с първичен ключ на родителската таблица, SQL Server ще изведе грешка.
Това помага за налагането на референтната цялост. Това ни пречи да имаме осиротели записи (записи за деца, които нямат родител). Или в нашия пример, албуми, които не са свързани с нито един изпълнител.
Ако използвате инструмент за управление на база данни с GUI като SSMS или Azure Data Studio, връзката ще се появи под Keys
възел за таблицата с външния ключ:
![](http://www.sqldat.com/article/uploadfiles/202205/2022051111445483.gif)
Нека деконструираме кода:
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId) REFERENCES dbo.Artists (ArtistId) ON DELETE NO ACTION ON UPDATE NO ACTION
Първите два реда създават връзката. Те създават ограничение за външен ключ между
Albums.ArtistId
колоната и
Artist.ArtistId
колона. В този случай ние наричаме ограничението на външния ключ FK_Albums_Artists
.
Последните два реда определят какво трябва да направи SQL Server, ако някой се опита да изтрие или актуализира родителски запис, който се препраща от запис в дъщерната таблица. В този случай NO ACTION
означава, че изтриването/актуализацията няма да продължи. Потребителят просто ще получи грешка.
Можете да промените това на ON DELETE CASCADE
ако искате да можете да изтриете родителя и детето наведнъж (т.е. изтриването ще премине каскадно от родителя към детето). Същата логика важи и за актуализациите, като се използва ON UPDATE CASADE
.
NO ACTION
е стойността по подразбиране, така че бихме могли да се справим без тези последни два реда код. Въпреки това го включих, защото това е важен фактор, за който трябва да се мисли, когато създавате ограничения за външния ключ.
Добавяне на връзка към съществуваща таблица
Предишният пример създава връзка в същото време, когато се създават таблиците. Въпреки това, може да има моменти, когато трябва да добавите връзка към съществуваща таблица.
Нека добавим нова връзка между Genres
и Albums
таблици.
Изпълнете следния код:
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 ;
Това създава нов външен ключ в Albums
маса. Това води до Albums.GenreId
превръщайки се във външен ключ, който препраща Genres.GenreId
.
Така че изпълнението на този израз води до показване на нов външен ключ под Ключовете възел:
![](http://www.sqldat.com/article/uploadfiles/202205/2022051111445477.gif)
Външни ключове с една колона
Външни ключове от една колона (като този по-горе) също могат да бъдат посочени на ниво колона. Така че друг начин за създаване на Albums
таблицата и нейният външен ключ е така:
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 );
Този метод не може да се използва за ограничения с много колони, така че за тях използвайте синтаксиса в оригиналния пример по-горе.
Многоколонови външни ключове
Многоколонен външен ключ е мястото, където повече от една колона се използва за външния ключ. Това обикновено се използва, когато родителската таблица използва множество колони за своя първичен ключ. Това може да е така, ако родителската таблица комбинира стойностите от две колони, за да създаде уникална стойност.
Многоколонови външни ключове могат да бъдат създадени с помощта на синтаксиса в оригиналния пример по-горе. Просто добавете всяко име на колона, разделено със запетая.
Така че, ако си представим, че Albums
таблицата също има ArtistName
колона (и че Artists
таблицата използва ArtistId
и ArtistName
като негов първичен ключ), външен ключ с много колони би изглеждал така:
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId, ArtistName) REFERENCES dbo.Artists (ArtistId, ArtistName)