Compartilhar via


Restrições de chave primária e estrangeira

Chave primárias e estrangeiras são dois tipos de restrições que podem ser usadas para impor integridade de dados nas tabelas do SQL Server. Esses são objetos de banco de dados importantes.

Este tópico inclui as seções a seguir.

Restrições de chave primária

Restrições de chave estrangeira

Tarefas relacionadas

Restrições de chave primária

Geralmente, uma tabela tem uma coluna ou uma combinação de colunas que contém valores que identificam exclusivamente cada linha na tabela. Essa coluna, ou colunas, é chamada de chave primária (PK) da tabela e impõe a integridade da entidade da mesma. Como as restrições de chave primária garantem dados exclusivos, elas são frequentemente definidas em uma coluna de identidade.

Quando especificar uma restrição PRIMARY KEY para uma tabela, o Mecanismo de Banco de Dados impõe a exclusividade dos dados criando automaticamente um índice exclusivo para as colunas de chave primária. Esse índice também permite um acesso rápido aos dados quando a chave primária é usada em consultas. Se uma restrição de chave primária for definida em mais de uma coluna, os valores poderão ser duplicados em uma coluna, mas cada combinação de valores de todas as colunas na definição de restrição de chave primária deverá ser exclusiva.

Conforme mostrado na ilustração a seguir, as colunas ProductID e VendorID na tabela Purchaseing.ProductVendor formam uma restrição de chave primária composta para esta tabela. Isso garante que todas as linhas da tabela ProductVendor têm uma combinação exclusiva de ProductID e VendorID. Isso impede a inserção de linhas duplicadas.

Restrição de chave primária composta

  • Uma tabela pode conter apenas uma restrição PRIMARY KEY.

  • Uma chave primária não pode exceder 16 colunas e um tamanho total de chave de 900 bytes.

  • O índice gerado por uma restrição de chave primária não pode fazer com que o número de índices na tabela exceda 999 índices não clusterizados e 1 índice clusterizado.

  • Se clusterizado ou não clusterizado não for especificado para uma restrição de chave primária, clusterizado será usado se não houver nenhum índice clusterizado na tabela.

  • Todas as colunas definidas em uma restrição PRIMARY KEY devem ser definidas como NOT NULL. Se a nulidade não for especificada, todas as colunas que participam de uma restrição de chave primária terão sua nulidade definida como não nula.

  • Se a chave primária for definida em uma coluna de tipo CLR definida pelo usuário, a implementação do tipo deverá oferecer suporte a uma ordenação binária.

Restrições de chave estrangeira

Uma chave estrangeira (FK) é uma coluna ou combinação de colunas usada para estabelecer e impor um link entre os dados de duas tabelas, a fim de controlar os dados que podem ser armazenados na tabela de chave estrangeira. 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 de outra tabela. Essa coluna torna-se uma chave estrangeira na segunda tabela.

Por exemplo, a tabela Sales.SalesOrderHeader tem um link de chave estrangeira para a tabela Sales.SalesPerson porque há uma relação lógica entre pedidos de vendas e 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 para a tabela SalesPerson . Ao criar essa relação de chave estrangeira, um valor para SalesPersonID não poderá ser inserido na tabela SalesOrderHeader se ainda não existir na tabela SalesPerson .

Índices de restrições de chave estrangeira

Ao contrário das restrições de chave primária, a criação de uma restrição de chave estrangeira não cria automaticamente um índice correspondente. No entanto, a criação manual de um índice em uma chave estrangeira geralmente é útil pelos seguintes motivos:

  • As colunas de chave estrangeira são frequentemente usadas em critérios de junção quando os dados de tabelas relacionadas são combinados em consultas, fazendo a correspondência de uma ou mais colunas na restrição FOREIGN KEY de uma tabela com uma ou mais colunas de chave exclusiva ou primária de outra tabela. Um índice permite que o Mecanismo de Banco de Dados encontre rapidamente dados relacionados na tabela de chaves estrangeiras. No entanto, a criação desse índice não é necessária. Os dados de duas tabelas relacionadas podem ser combinados até mesmo se nenhuma restrição PRIMARY KEY ou FOREIGN KEY tiver 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 usa chaves como critérios.

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

Integridade referencial

Embora o propósito principal da restrição FOREIGN KEY seja controlar os dados que podem ser armazenados na tabela de chave estrangeira, ela também controla as alterações efetuadas nos dados da tabela de chave primária. Por exemplo, se a linha de 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á interrompida; Os pedidos de vendas do vendedor excluído ficam órfãos na tabela SalesOrderHeader sem um link para os dados na tabela SalesPerson .

Uma restrição FOREIGN KEY impede essa situação. A restrição impõe integridade referencial garantindo que as alterações não possam ser feitas aos dados na tabela de chave primária se essas alterações invalidarem o link para dados na tabela de chave estrangeira. Se for feita uma tentativa de excluir a linha em uma tabela de chave primária ou alterar um valor de chave primária, a ação falhará quando o valor da chave primária excluído ou alterado corresponder a um valor na restrição de chave estrangeira 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 da tabela de chave estrangeira ou alterar os dados de chave estrangeira na tabela de chave estrangeira, o que vinculará a chave estrangeira aos diversos dados de chave primária.

Integridade referencial em cascata

Usando restrições de integridade referencial em cascata, é possível definir as ações que o Mecanismo de Banco de Dados executa quando o usuário tenta excluir ou atualizar uma chave para a qual apontam as chaves estrangeiras existentes. As ações em cascata a seguir podem ser definidas.

NO ACTION O Mecanismo de Banco de Dados gera um erro e a ação de exclusão ou atualização na linha na tabela pai é revertida.

CASCADE As linhas correspondentes são atualizadas ou excluídas na tabela de referência quando essa linha é atualizada ou excluída na tabela pai. CASCADE não poderá ser especificado se uma timestamp coluna fizer parte da chave estrangeira ou da chave referenciada. ON DELETE CASCADE não pode ser especificado para uma tabela que tem um gatilho INSTEAD OF DELETE. ON UPDATE CASCADE não pode ser especificado para tabelas que possuem triggers INSTEAD OF UPDATE.

SET NULL Todos os valores que compõem a chave estrangeira são definidos como NULL quando a linha correspondente na tabela pai é atualizada ou excluída. Para que essa restrição seja executada, as colunas de chave estrangeira devem ser anuláveis. Não é possível especificar para tabelas que têm gatilhos INSTEAD OF UPDATE.

SET DEFAULT Todos os valores que compõem a chave estrangeira serão definidos como seus valores padrão se a linha correspondente na tabela pai for atualizada ou excluída. Para que essa restrição seja executada, todas as colunas de chave estrangeira devem ter definições padrão. Se a coluna for anulável e não houver nenhum valor padrão explícito definido, NULL se tornará o valor padrão implícito para a coluna. Não é possível especificar para tabelas que têm gatilhos INSTEAD OF UPDATE.

CASCADE, SET NULL, SET DEFAULT e NO ACTION podem ser combinados nas tabelas que tenham relacionamentos referenciais entre si. Se o Mecanismo de Banco de Dados encontrar NO ACTION, parará e reverterá as ações CASCATA, SET NULL e SET DEFAULT. Quando uma instrução DELETE provoca uma combinação de ações CASCADE, SET NULL, SET DEFAULT e NO ACTION, todas as ações CASCADE, SET NULL e SET DEFAULT são aplicadas antes que o Mecanismo de Banco de Dados verifique se existe alguma NO ACTION.

Gatilhos e ações referenciais em cascata

As ações referenciais em cascata acionam os gatilhos AFTER UPDATE ou AFTER DELETE da seguinte maneira:

  • Todas as ações referenciais em cascata diretamente causadas pelo DELETE ou UPDATE originais são executadas primeiro.

  • Se houver gatilhos AFTER definidos nas tabelas afetadas, esses gatilhos serão disparados depois que todas as ações em cascata forem executadas. Os gatilhos são acionados em ordem oposta à ordem da ação em cascata. Se houver vários gatilhos em uma única tabela, eles serão disparados em ordem aleatória, a menos que haja um primeiro ou último gatilho dedicado para a tabela. Essa ordem é especificada usando sp_settriggerorder.

  • Se várias cadeias em cascata se originarem da tabela que era o destino direto de uma ação UPDATE ou DELETE, a ordem na qual essas cadeias disparam seus respectivos gatilhos não é especificada. Porém, uma cadeia sempre aciona todos os seus gatilhos antes que outra cadeia inicie o acionamento.

  • Um gatilho AFTER na tabela que é o destino direto de uma ação UPDATE ou DELETE é acionado, independentemente de alguma linha ser afetada. Não há nenhuma outra tabela afetada em cascata nesse caso.

  • Se qualquer um dos gatilhos anteriores executar operações UPDATE ou DELETE em outras tabelas, essas ações poderão iniciar cadeias em cascata secundárias. Essas cadeias secundárias são processadas individualmente para cada operação UPDATE ou DELETE após todos os disparadores em todas as cadeias primárias serem acionados. Esse processo pode ser repetido recursivamente para operações UPDATE ou DELETE subsequentes.

  • Executar operações CREATE, ALTER, DELETE ou outras DDL (linguagem de definição de dados) dentro dos gatilhos pode fazer com que os gatilhos DDL sejam acionados. Posteriormente, isso pode executar operações DELETE ou UPDATE que iniciam cadeias e gatilhos em cascata adicionais.

  • Se um erro for gerado dentro de qualquer cadeia de ação referencial em cascata específica, um erro será gerado, nenhum gatilho AFTER será acionado nessa cadeia e a operação DELETE ou UPDATE que criou a cadeia será revertida.

  • Uma tabela que possui um disparador INSTEAD OF também não pode ter uma cláusula REFERENCES que especifica uma ação em cascata. No entanto, um gatilho AFTER em uma tabela direcionada por uma ação em cascata pode executar uma instrução INSERT, UPDATE ou DELETE em outra tabela ou exibição que dispara um gatilho INSTEAD OF definido nesse objeto.

Tarefas Relacionadas

A tabela a seguir lista as tarefas comuns associadas às restrições de chave primária e chave estrangeira.

Tarefa Tópico
Descreve como criar uma chave primária. Criar Chaves Primárias
Descreve como excluir uma chave primária. Excluir chaves primárias
Descreve como modificar uma chave primária. Modificar chaves primárias
Descreve como criar relações de chave estrangeira Criar relações de chaves estrangeiras
Descreve como modificar as relações de chave estrangeira. Modificar relações de chave estrangeira
Descreve como excluir relações de chave estrangeira. Excluir relações de chaves estrangeiras
Descreve como exibir propriedades de chave estrangeira. Exibir propriedades de chave estrangeira
Descreve como desabilitar restrições de chave estrangeira para replicação. Desabilitar restrições de chave estrangeira para a replicação
Descreve como desabilitar restrições de chave estrangeira durante uma instrução INSERT ou UPDATE. Desabilitar restrições de chave estrangeira com instruções INSERT e UPDATE