Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Criar um relacionamento no SQL Server 2017


Saiba como criar uma relação entre duas tabelas no SQL Server.

No projeto de banco de dados relacional, um relacionamento é onde duas ou mais tabelas estão vinculadas porque contêm dados relacionados. Isso permite que os usuários executem consultas de dados relacionados em várias tabelas.

Esta parte do tutorial explica como criar os seguintes relacionamentos:

Há dois relacionamentos nesse diagrama. Há uma relação entre os Albums e Artists tabelas, e há outro relacionamento entre os Albums e Genres mesas.

Ao olhar para esse diagrama, podemos ver que um artista pode ter muitos álbuns. Nesse caso, precisamos ter apenas uma linha que contenha o nome do artista, independente de quantos álbuns ele tenha. Isso porque podemos criar um registro no Artists tabela com um ArtistId exclusivo . Todos os álbuns desse artista residirão em Albums tabela, e eles conterão o mesmo ID do artista em seu próprio ArtistId coluna. Ao fazer isso, podemos executar uma consulta nas duas tabelas e retornar o nome do artista, além de todos os álbuns que eles lançaram. Este é o benefício dos relacionamentos.

Anteriormente, criamos um banco de dados contendo as três tabelas acima. Quando fizemos isso, também criamos um dos relacionamentos descritos no diagrama acima. Criamos o relacionamento entre os Albums tabela e os Artists tabela (onde o ArtistId coluna dos Albums tabela referencia o ArtistsId coluna dos Artists tabela).

Aqui está o código que executamos para criar as tabelas:

O código destacado é a parte que cria um relacionamento entre os Albums tabela e os Artists tabela. Ele faz isso definindo o ArtistId coluna dos Albums para referenciar o ArtistId coluna dos Artists tabela.

Uma maneira mais técnica de dizer isso é que Albums.ArtistId torna-se uma chave estrangeira de Artists.ArtistId (que em si é a chave primária dessa tabela). Esta é uma restrição de chave estrangeira.

O que é uma restrição de chave estrangeira?


Uma restrição de chave estrangeira define um relacionamento entre esta tabela e outra tabela. Ao criar uma restrição de chave estrangeira, você a cria em uma coluna específica no filho tabela, para referenciar uma coluna específica em pai tabela.

Isso torna essa coluna na tabela filha uma chave estrangeira . A restrição garante que qualquer valor que vá para essa coluna (chave estrangeira) corresponda a um valor na coluna de chave primária da tabela pai. Se alguém tentar inserir um valor que não corresponda a um valor na coluna de chave primária da tabela pai, o SQL Server gerará um erro.

Isso ajuda a reforçar a integridade referencial. Isso nos impede de ter registros órfãos (registros filhos que não têm pai). Ou em nosso exemplo, álbuns que não estão associados a nenhum artista.

Se você usar uma ferramenta de gerenciamento de banco de dados GUI, como SSMS ou Azure Data Studio, a relação aparecerá em Keys node para a tabela com a chave estrangeira:

Vamos desconstruir o código:
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId)     
    REFERENCES dbo.Artists (ArtistId)     
    ON DELETE NO ACTION    
    ON UPDATE NO ACTION

As duas primeiras linhas criam o relacionamento. Eles criam uma restrição de chave estrangeira entre o Albums.ArtistId coluna e o Artists.ArtistId coluna. Neste caso, chamamos a restrição de chave estrangeira FK_Albums_Artists .

As duas últimas linhas especificam o que o SQL Server deve fazer se alguém tentar excluir ou atualizar um registro pai que está sendo referenciado por um registro na tabela filho. Neste caso, NO ACTION significa que a exclusão/atualização não será realizada. O usuário receberá apenas um erro.

Você pode alterar isso para ON DELETE CASCADE se você quiser excluir o pai e o filho de uma só vez (ou seja, a exclusão será em cascata do pai para o filho). A mesma lógica se aplica às atualizações, usando ON UPDATE CASADE .

NO ACTION é o valor padrão, então poderíamos ter feito sem essas duas últimas linhas de código. No entanto, eu o incluí, porque é um fator importante a ser considerado ao criar restrições de chave estrangeira.

Adicionar um relacionamento a uma tabela existente


O exemplo anterior cria um relacionamento ao mesmo tempo em que as tabelas são criadas. No entanto, pode haver momentos em que você precise adicionar um relacionamento a uma tabela existente.

Vamos adicionar um novo relacionamento entre os Genres e Albums mesas.

Execute o seguinte código:
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
;

Isso cria uma nova chave estrangeira nos Albums tabela. Isso resulta em Albums.GenreId tornando-se uma chave estrangeira que faz referência a Genres.GenreId .

Portanto, executar essa instrução resulta em uma nova chave estrangeira sendo exibida sob as Chaves nó:

Chaves estrangeiras de coluna única


Chaves estrangeiras de coluna única (como a acima) também podem ser especificadas no nível da coluna. Então, outra maneira de criar os Albums table e sua chave estrangeira é assim:
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   
);

Esse método não pode ser usado em restrições de chave de várias colunas, portanto, para isso, use a sintaxe do exemplo original acima.

Chaves estrangeiras de várias colunas


Uma chave estrangeira de várias colunas é onde mais de uma coluna é usada para a chave estrangeira. Isso geralmente é usado quando a tabela pai usa várias colunas para sua chave primária. Esse pode ser o caso se a tabela pai combinar os valores de duas colunas para criar um valor exclusivo.

As chaves estrangeiras de várias colunas podem ser criadas usando a sintaxe do exemplo original acima. Basta adicionar cada nome de coluna separado por uma vírgula.

Então, se imaginarmos que os Albums tabela também tem um ArtistName coluna (e que os Artists tabela usa ArtistId e ArtistName como sua chave primária), uma chave estrangeira de várias colunas ficaria assim:
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId, ArtistName)     
    REFERENCES dbo.Artists (ArtistId, ArtistName)