Criar relações de chaves estrangeiras

Aplica-se a: SQL Server 2016 (13.x) e versões posteriores Banco de Dados SQL do AzureInstâ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 no esquema no qual a tabela está sendo criada.

Criar uma chave estrangeira em uma tabela existente requer a permissão ALTER na tabela.

Limitações e restriçõ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ção FOREIGN 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 FOREIGN KEY composta foram verificados, especifique NOT 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 mais informações, veja CREATE TRIGGER.

  • As restrições FOREIGN KEY podem fazer referência à 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ções FOREIGN KEY pertencentes a outras tabelas que fazem referência a uma tabela específica. Entretanto, o número real de restrições FOREIGN 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 posterior aumenta 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 and UPDATE DML. Não há suporte para operações MERGE.
    • Uma tabela com uma referência de chave estrangeira a ela mesma ainda é limitada a 253 referências de chave estrangeira.
    • O uso de mais de 253 referências de chave estrangeira não está disponível atualmente para índices columnstore, tabelas com otimização de memória nem para o Stretch Database.

    Importante

    O Stretch Database foi preterido no SQL Server 2022 (16.x). Esse recurso será removido em uma versão futura do Microsoft SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam.

  • 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

  1. 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 no Designer de Tabela.

  2. 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... .)

  3. 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>, em que o primeiro tablename é o nome da tabela de chave estrangeira e o segundo tablename é o nome da tabela de chave primária. Essa é simplesmente uma convenção de nomenclatura padrão e comum para o campo (Name) do objeto de chave estrangeira.

  4. Selecione a relação na lista Relação Selecionada.

  5. Selecione Especificação de Tabelas e Colunas na grade à direita e selecione as reticências ( ... ) à direita da propriedade.

  6. 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.

  7. Na grade inferior, 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 .

  8. Escolha OK para criar a relação.

  9. 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
;

Próximas etapas