Restrições FOREIGN KEY

Uma chave estrangeira (FK) é uma coluna ou combinação de colunas que é usada para estabelecer e impor um link entre os dados em duas tabelas. Você pode criar uma chave estrangeira definindo uma restrição FOREIGN KEY ao criar ou modificar uma tabela.

Em uma referência de chave estrangeira, cria-se um link entre duas tabelas quando a coluna ou as colunas que contêm o valor de chave primária para uma tabela são referenciadas pela coluna ou colunas em outra tabela. Essa coluna torna-se uma chave estrangeira na segunda tabela.

Por exemplo, a tabela Sales.SalesOrderHeader no banco de dados AdventureWorks2008R2 tem um link com a tabela Sales.SalesPerson porque existe uma relação lógica entre os pedidos de vendas e os vendedores. A coluna SalesPersonID na tabela SalesOrderHeader corresponde à coluna de chave primária da tabela SalesPerson. A coluna SalesPersonID na tabela SalesOrderHeader é a chave estrangeira à tabela SalesPerson.

SalesOrderHeader.SalesPersonID é uma chave estrangeira.

Uma restrição FOREIGN KEY não precisa estar vinculada apenas a uma restrição de PRIMARY KEY em outra tabela; ela também pode ser definida para referenciar as colunas de uma restrição UNIQUE em outra tabela. Uma restrição FOREIGN KEY pode conter valores nulos; contudo, se alguma coluna de uma restrição FOREIGN KEY composta contiver valores nulos, a verificação de todos os valores que formam a restrição FOREIGN KEY será ignorada. Para certificar-se de que todos os valores de uma restrição FOREIGN KEY composta foram verificados, especifique NOT NULL em todas as colunas participantes.

ObservaçãoObservação

Uma restrição FOREIGN KEY pode referenciar colunas em tabelas no mesmo banco de dados ou na mesma tabela. Essas são chamadas de tabelas auto-referenciadas. Por exemplo, considere uma tabela de funcionários que contenha três colunas: employee_number, employee_namee manager_employee_number. Como o gerente também é um funcionário, há uma relação de chave estrangeira da coluna manager_employee_number para a coluna employee_number.

Integridade referencial

Embora o propósito principal da restrição de FOREIGN KEY seja controlar os dados que podem ser armazenados na tabela de chave estrangeira, ela também controla as alterações aos dados na tabela de chave primária. Por exemplo, se a linha para um vendedor for excluída da tabela Sales.SalesPerson e a ID do vendedor for usada para pedidos de vendas na tabela Sales.SalesOrderHeader, a integridade relacional entre as duas tabelas será quebrada; os pedidos de vendas do vendedor excluído estão órfãos na tabela SalesOrderHeader sem um link aos dados na tabela SalesPerson.

Uma restrição FOREIGN KEY impede essa situação. A restrição impõe a integridade referencial ao garantir que não possam ser feitas alterações na tabela de chave primária se essas alterações invalidarem o link aos dados na tabela de chave estrangeira. Se for feita uma tentativa para excluir a linha em uma tabela de chave primária ou para mudar um valor de chave primária, a ação apresentará falha se o valor de chave primária excluído ou alterado corresponder a um valor na restrição FOREIGN KEY de outra tabela. Para obter sucesso ao alterar ou excluir uma linha em uma restrição FOREIGN KEY, você precisa primeiro excluir os dados de chave estrangeira na tabela de chave estrangeira ou alterar os dados de chave estrangeira na tabela de chave estrangeira que vincula a chave estrangeira aos diversos dados de chave primária.

Indexando restrições FOREIGN KEY

Muitas vezes, é útil criar um índice em uma chave estrangeira pelas razões seguintes:

  • As alterações a restrições PRIMARY KEY são verificadas com restrições FOREIGN KEY em tabelas relacionadas.

  • As colunas de chave estrangeira são freqüentemente usadas em critérios de junção quando os dados de tabelas relacionadas são combinados em consultas ao corresponder a coluna ou as colunas na restrição FOREIGN KEY de uma tabela com a coluna ou colunas de chave exclusiva ou primária em outra tabela. Um índice habilita o Mecanismo de Banco de Dados a localizar rapidamente dados relacionados na tabela de chave estrangeira. Porém, a criação desse índice não é exigida. Os dados de duas tabelas relacionadas podem ser combinados mesmo que nenhuma restrição PRIMARY KEY ou FOREIGN KEY tenha sido definida entre as tabelas, mas uma relação de chave estrangeira entre duas tabelas indica que estas foram otimizadas para serem combinadas em uma consulta que use chaves como critérios. Para obter mais informações sobre como usar restrições FOREIGN KEY com junções, consulte Conceitos básicos de junção e Tipos de consulta e índices.

Número de restrições FOREIGN KEY em uma tabela

O SQL Server não tem um limite predefinido quanto ao número de restrições FOREIGN KEY que uma tabela pode conter (que referenciam outras tabelas), nem quanto ao número de restrições FOREIGN KEY em outras tabelas que fazem referência a essa tabela específica. Entretanto, o número real de restrições FOREIGN KEY é limitado pela configuração de seu hardware e pelo design de seu banco de dados e de seu aplicativo. Recomendamos que uma tabela não contenha mais de 253 restrições FOREIGN KEY, e que ela não seja referenciada por mais de 253 restrições FOREIGN KEY. Considere o custo de impor restrições FOREIGN KEY ao criar seu banco de dados e seus aplicativos.