Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Създайте връзка в SQL Server 2017

Научете как да създадете връзка между две таблици в SQL Server.

В дизайна на релационна база данни, връзка е мястото, където две или повече таблици са свързани заедно, защото съдържат свързани данни. Това позволява на потребителите да изпълняват заявки за свързани данни в множество таблици.

Тази част от урока обяснява как да създадете следните връзки:

В тази диаграма има две връзки. Има връзка между Albums и Artists таблици и има друга връзка между Albums и Genres таблици.

Като разгледаме тази диаграма, можем да видим, че един изпълнител може да има много албуми. В този случай трябва да имаме само един ред, който съдържа името на изпълнителя, независимо колко албума има. Това е така, защото можем да създадем запис в Artists таблица с уникален ArtistId . Всички албуми за този изпълнител ще се намират в Albums таблица и те ще съдържат същия идентификатор на изпълнител в своя собствен ArtistId колона. По този начин можем да изпълним заявка в двете таблици и да върнем името на изпълнителя, плюс всички албуми, които са издали. Това е ползата от взаимоотношенията.

По-рано създадохме база данни, съдържаща горните три таблици. Когато направихме това, създадохме и една от връзките, изобразени на горната диаграма. Създадохме връзката между Albums таблицата и Artists таблица (където ArtistId колона на Albums таблицата препраща към ArtistsId колона на Artists таблица).

Ето кода, който изпълнихме, за да създадем таблиците:

Маркираният код е частта, която създава връзка между Albums таблицата и Artists маса. Прави това, като задава ArtistId колона на Albums за справка с ArtistId колона на Artists таблица.

По-технически начин да се каже това е Albums.ArtistId става външен ключ на Artists.ArtistId (който сам по себе си е първичният ключ на тази таблица). Това е ограничение за външен ключ.

Какво е ограничение за външен ключ?

Ограничение за външен ключ дефинира връзка между тази таблица и друга таблица. Когато създавате ограничение за външен ключ, вие го създавате срещу конкретна колона в дъщето таблица, за да посочите конкретна колона в родител таблица.

Това прави тази колона в дъщерната таблица външен ключ . Ограничението гарантира, че всяка стойност, която влиза в тази колона (външен ключ), съответства на стойност в колоната с първичен ключ на родителската таблица. Ако някой се опита да въведе стойност, която не съответства на стойност в колоната с първичен ключ на родителската таблица, SQL Server ще изведе грешка.

Това помага за налагането на референтната цялост. Това ни пречи да имаме осиротели записи (записи за деца, които нямат родител). Или в нашия пример, албуми, които не са свързани с нито един изпълнител.

Ако използвате инструмент за управление на база данни с GUI като SSMS или Azure Data Studio, връзката ще се появи под Keys възел за таблицата с външния ключ:

Нека деконструираме кода:

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 .

Така че изпълнението на този израз води до показване на нов външен ключ под Ключовете възел:

Външни ключове с една колона

Външни ключове от една колона (като този по-горе) също могат да бъдат посочени на ниво колона. Така че друг начин за създаване на 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)

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да сравним датите в SQL Server

  2. Растерни изображения в пакетен режим в SQL Server

  3. Съставен първичен ключ срещу допълнителен идентификационен номер колона?

  4. Най-добрият начин да получите PK Guid за вмъкнат ред

  5. RAND() Примери в SQL Server