Criar relações de chaves estrangeiras
Aplica-se a: SQL Server 2016 (13.x) e posterior Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure
Este artigo descreve como criar relações de chaves estrangeiras no SQL Server usando o SQL Server Management Studio ou o Transact-SQL. Você cria uma relação entre duas tabelas quando deseja associar linhas de uma tabela com linhas de outra.
Permissões
A criação de uma tabela com uma chave estrangeira requer a permissão CREATE TABLE no banco de dados e a permissão ALTER SCHEMA no esquema no qual a tabela está sendo criada.
Criar uma chave estrangeira em uma tabela existente requer a permissão ALTER TABLE na tabela.
Limitações
Uma restrição de chave estrangeira não precisa estar vinculada somente a uma restrição de chave primária em outra tabela. As chaves estrangeiras também podem ser definidas para fazer referência às colunas de uma restrição
UNIQUE
em outra tabela.Quando um valor diferente de
NULL
é inserido na coluna de uma restriçãoFOREIGN KEY
, o valor precisa existir na coluna referenciada. Caso contrário, uma mensagem de erro de violação de chave estrangeira será retornada. Para garantir que todos os valores de uma restrição de chave estrangeira composta sejam verificados, especifiqueNOT NULL
em todas as colunas participantes.As restrições
FOREIGN KEY
só podem fazer referência a tabelas que estão no mesmo banco de dados e no mesmo servidor. A integridade referencial em todos os bancos de dados deve ser implementada por gatilhos. Para obter mais informações, veja CREATE TRIGGER (Transact-SQL).As restrições
FOREIGN KEY
podem fazer referência a outra coluna da mesma tabela e são autorreferenciadas.Uma restrição
FOREIGN KEY
especificada no nível da coluna pode listar apenas uma coluna de referência. Essa coluna deve ter o mesmo tipo de dados da coluna na qual a restrição foi definida.Uma restrição
FOREIGN KEY
especificada no nível da tabela deve ter o mesmo número de colunas de referência da lista de colunas de restrição. O tipo de dados de cada coluna de referência também deve ser igual ao da coluna correspondente na lista de colunas.O mecanismo de banco de dados não tem um limite predefinido do número de restrições
FOREIGN KEY
que uma tabela pode conter para fazer referência a outras tabelas. O mecanismo de banco de dados também não limita o número de restriçõesFOREIGN KEY
pertencentes a outras tabelas que fazem referência a uma tabela específica. Entretanto, o número real de restriçõesFOREIGN KEY
usado é limitado pela configuração do hardware e pelo design do banco de dados e do aplicativo. Uma tabela pode fazer referência a no máximo 253 outras tabelas e colunas como chaves estrangeiras (referências de saída). O SQL Server 2016 (13.x) e versões posteriores aumentam de 253 para 10.000 o limite para o número de outras tabelas e colunas que podem fazer referência a colunas em uma tabela (referências de entrada). (Requer, no mínimo, o nível de compatibilidade 130.) O aumento tem as seguintes restrições:Há suporte para mais de 253 referências de chave estrangeira em operações
DELETE
eUPDATE
. OperaçõesMERGE
não são suportadas.Uma tabela com uma referência de chave estrangeira a ela mesma ainda é limitada a 253 referências de chave estrangeira.
Mais de 253 referências de chave estrangeira não estão disponíveis atualmente para índices columnstore ou tabelas com otimização de memória.
As restrições
FOREIGN KEY
não são impostas a tabelas temporárias.Se a chave estrangeira for definida em uma coluna de tipo de dados CLR definido pelo usuário, a implementação do tipo deverá oferecer suporte a uma ordenação binária. Para obter mais informações, veja Tipos CLR definidos pelo usuário.
Uma coluna do tipo varchar(max) poderá participar de uma restrição
FOREIGN KEY
somente se a chave primária à qual ela fizer referência também estiver definida como tipo varchar(max).
Criar uma relação de chave estrangeira no Designer de Tabela
Usar o SQL Server Management Studio
No Pesquisador de Objetos, clique com o botão direito do mouse na tabela que estará ao lado da chave estrangeira da relação e selecione Design.
A tabela é aberta em Criar e atualizar tabelas de banco de dados.
No menu Designer de Tabela, selecione Relações. (Confira o menu Designer de Tabela no cabeçalho ou clique com o botão direito do mouse no espaço vazio da definição da tabela e selecione Relações....)
Na caixa de diálogo Relações de Chave Estrangeira, selecione Adicionar.
A relação é exibida na lista Relação Selecionada com um nome fornecido pelo sistema no formato
FK_<tablename>_<tablename>
, no qual o primeiro tablename é o nome da tabela de chave estrangeira e o segundo tablename é o nome da tabela de chave primária. Essa é apenas uma convenção de nomenclatura padrão e comum para o campo (Name) do objeto de chave estrangeira.Selecione a relação na lista Relação Selecionada.
Selecione Especificação de Tabelas e Colunas na grade à direita e selecione as reticências (...) à direita da propriedade.
Na caixa de diálogo Tabelas e Colunas , na lista suspensa Chave Primária , escolha a tabela que estará ao lado da chave primária da relação.
Na grade inferior da caixa de diálogo, escolha as colunas que contribuem para chave primária da tabela. Na célula da grade adjacente à direita de cada coluna, escolha a coluna da chave estrangeira correspondente da tabela da chave estrangeira.
ODesigner de Tabela sugere um nome para a relação. Para mudar esse nome, edite o conteúdo da caixa de texto Nome da Relação .
Escolha OK para criar a relação.
Feche a janela do designer de tabela e salve as suas alterações para que a alteração da relação de chave estrangeira entre em vigor.
Criar uma chave estrangeira em uma nova tabela
Usar o Transact-SQL
O exemplo a seguir cria uma tabela e define uma restrição de chave estrangeira na coluna TempID
que referencia a coluna SalesReasonID
na tabela Sales.SalesReason
do banco de dados AdventureWorks
. As cláusulas ON DELETE CASCADE
e ON UPDATE CASCADE
são usadas para assegurar a propagação das alterações feitas na tabela Sales.SalesReason
automaticamente para a tabela Sales.TempSalesReason
.
CREATE TABLE Sales.TempSalesReason (
TempID INT NOT NULL,
Name NVARCHAR(50),
CONSTRAINT PK_TempSales
PRIMARY KEY NONCLUSTERED (TempID),
CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
REFERENCES Sales.SalesReason(SalesReasonID)
ON DELETE CASCADE
ON UPDATE CASCADE
);
Criar uma chave estrangeira em uma tabela existente
Usar o Transact-SQL
O exemplo a seguir cria uma chave estrangeira na coluna TempID
e referencia a coluna SalesReasonID
na tabela Sales.SalesReason
no banco de dados AdventureWorks
.
ALTER TABLE Sales.TempSalesReason
ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
REFERENCES Sales.SalesReason (SalesReasonID)
ON DELETE CASCADE
ON UPDATE CASCADE;