Como criar restrições de chave estrangeira em SQL

Se você possui uma empresa, deve ter encontrado o valor e a necessidade de dados em seu negócio. Ter os meios para armazenar e manipular bancos de dados agrega mais valor ao negócio.

Os bancos de dados são organizados em uma convenção específica e permitem estruturar os dados em conexões, levando-nos aos bancos de dados relacionais, que foram adotados como uma forma de gerenciamento de dados desde a década de 1970. E no mercado atual, os bancos de dados relacionais são preferidos por suas capacidades de manipulação de dados.

Embora existam muitos bancos de dados relacionais disponíveis, o MySQL alcançou a liderança, classificando-se como o número dois do mundo, de acordo com a Statista, em janeiro de 2022.

No servidor SQL, as restrições são regras predefinidas e limitações impostas em uma ou várias colunas; eles estão vinculados aos valores na coluna e ajudam a manter a integridade, precisão e confiabilidade dos dados das colunas especificadas.

Simplificando, apenas os dados que atendem à regra de restrição são inseridos com sucesso na coluna. A operação de inserção é encerrada se os dados não atenderem aos critérios.

Esta postagem pressupõe que você encontrou bancos de dados relacionais, especificamente – MySQL, e deseja fortalecer seu conhecimento no domínio. Por fim, compartilharei algumas dicas para interagir com restrições de chave estrangeira.

Restrições de chave primária – Uma recapitulação

Uma tabela em SQL envolve uma coluna ou várias contendo valores-chave que identificam com precisão cada linha nos sistemas. A coluna ou colunas denominadas chave primária (PK) da tabela tem a função de reforçar a integridade da entidade da tabela. As restrições de chave primária garantem dados exclusivos e geralmente são definidas em uma coluna de identidade.

Ao especificar as restrições de chave primária para sua tabela, o mecanismo de banco de dados impõe automaticamente a exclusividade dos dados gerando índices exclusivos para cada uma das colunas primárias. As chaves primárias oferecem uma vantagem extrema quando usadas em consultas, fornecendo acesso rápido aos dados.

Se as restrições de chave primária forem definidas em várias colunas, elas serão chamadas de chave primária composta ou composta. E, nesse caso, cada coluna de chave primária pode conter valores duplicados. No entanto, os valores combinados de todas as colunas na chave primária devem ser exclusivos.

Um bom exemplo é um caso em que você tem uma tabela com as colunas `id`, `names` e `age`. Quando você define sua restrição de chave primária na combinação de `id` e `names`, você pode ter instâncias duplicadas dos valores `id` ou `names`. Ainda assim, cada combinação deve ser única para evitar linhas duplicadas. Então, você pode ter registros com `id=1` e `name=Walter`, e `age-22” e `id=1`, `name=Henry` e `age=27`, mas você não pode ter outros registros com `id=1` e `name=Walter` porque a combinação não é única.

Aqui estão alguns aspectos essenciais a saber:

  • Uma tabela contém apenas uma restrição de chave primária.
  • As chaves primárias não podem exceder 16 colunas e um comprimento máximo de 900 caracteres.
  • Os índices gerados pelas chaves primárias podem aumentar os da tabela. No entanto, o número de índices clusterizados em uma tabela não pode exceder 1 e o número de índices não clusterizados em uma tabela é limitado a 999.
  • Quando clusterizado e não clusterizado não são especificados para uma restrição de chave, o clusterizado é obtido automaticamente.
  • Todas as colunas declaradas dentro de uma restrição de chave primária devem ser definidas como não nulas. Se não for esse o caso, todas as colunas vinculadas na restrição terão sua capacidade de nulidade definida roboticamente como não nula.
  • Quando as chaves primárias são definidas no tipo de coluna definida pelo usuário Common Language Runtime (CLR), a implementação do tipo deve oferecer suporte à ordenação binária.
  •   Como descongelar uma conta pós-pagamento

    Restrições de chave estrangeira – um resumo

    Uma chave estrangeira (FK) envolve uma coluna ou uma combinação de várias usadas para criar e vincular um link entre duas tabelas e gerencia os dados a serem armazenados em uma tabela de chave estrangeira.

    Uma referência de chave estrangeira envolve a criação de um link entre duas tabelas; quando uma coluna ou colunas contendo a chave primária para outra tabela são referenciadas por uma coluna ou colunas em uma tabela diferente.

    No cenário de referência de chave estrangeira, uma conexão é criada entre duas tabelas quando uma coluna ou colunas contendo chaves primárias em uma tabela são referenciadas por colunas em outra.

    Em um caso de uso prático, você pode ter uma tabela, Sales.SalesOrderHeader, com uma chave estrangeira vinculada a outra tabela, Sales.Pessoa, porque há um relacionamento lógico entre vendedores e pedidos de vendas.

    Aqui, o SalesPersonID na coluna SalesOrderHeader combina com a coluna de chave primária da tabela SalesPerson. A chave estrangeira da tabela SalesPerson é a coluna SalesPersonID no SalesOrderHeader.

    Esse relacionamento define uma regra: um valor SalesPersonID não pode estar em sua tabela SalesOrderHeader se não existir na tabela SalesPerson.

    Uma tabela pode fazer referência a até 253 outras colunas e tabelas como chaves estrangeiras, também chamadas de referências de saída. Desde 2016, o servidor SQL aumentou o número de tabelas e colunas que você pode referenciar em uma única tabela, também conhecidas como referências de entrada, de 253 para 10.000. No entanto, o aumento vem com algumas restrições:

  • Referências de chave estrangeira superiores a 253 estão disponíveis apenas para as operações DELETE DML. MERGE e UPDATE não são suportados.
  • Tabelas com referências de chaves estrangeiras a si mesmas têm no máximo 253 referências de chaves estrangeiras.
  • Para índices de armazenamento de coluna, tabelas com otimização de memória e tabelas de chave estrangeira particionada, as referências de chave estrangeira são limitadas a 253.
  • Quais são os benefícios das chaves estrangeiras?

    Conforme mencionado anteriormente, as restrições de chave estrangeira desempenham um papel essencial na proteção da integridade e consistência dos dados no banco de dados relacional. Aqui está uma análise das razões pelas quais as restrições de chave estrangeira são essenciais.

  • Integridade referencial – As restrições de chave estrangeira garantem que cada registro da tabela filho corresponda a um registro da tabela primária, garantindo a consistência dos dados em ambas as tabelas.
  • Evitando registros órfãos – Se você excluir uma tabela pai, as restrições de chave estrangeira garantem que sua tabela filho associada também seja excluída, evitando instâncias de registros órfãos que podem levar à inconsistência de dados.
  • Desempenho aprimorado – As restrições de chave estrangeira aumentam o desempenho da consulta, permitindo que o sistema de gerenciamento de banco de dados otimize as consultas com base nos relacionamentos da tabela.
  •   Como reduzir ruído de fundo e eco em memorandos de voz do iPhone

    Índices de Restrições de Chave Estrangeira

    As restrições de chave estrangeira não criam índices correspondentes automaticamente como o primário. Você pode criar índices manualmente para restrições de chave estrangeira; é benéfico pelas seguintes razões.

    • As colunas de chave estrangeira geralmente são usadas nos critérios de junção ao combinar dados de tabelas relacionadas em consultas, combinando as colunas vinculadas à restrição. Os índices ajudam o banco de dados a encontrar dados associados em uma tabela estrangeira.
    • Se você alterar as restrições de chave primária, elas serão verificadas com as estrangeiras nas tabelas relacionadas.

    Não é obrigatório criar índices. Você ainda pode combinar dados de duas tabelas sem especificar as restrições de chave primária e estrangeira. No entanto, adicionar restrições de chave estrangeira otimiza as tabelas e as combina em uma consulta que atende aos critérios de uso das chaves. Se você alterar as restrições de chave primária, elas serão verificadas com as estrangeiras relacionadas.

    Dicas para criar restrições de chave estrangeira em SQL

    Você já gastou um tempo significativo na especulação; respondeu o porquê. Vamos mudar nosso foco e reduzi-lo às táticas para criar restrições de chave estrangeira; responda o como.

    Um campo `Foreign Key` em uma tabela refere-se à `Primary Key` de outra. A tabela com a chave primária é sua tabela pai. E a tabela com a chave estrangeira é chamada de tabela filha. Vamos mergulhar.

    Criando uma chave estrangeira ao criar uma tabela

    Ao criar uma tabela, você também pode criar uma restrição de chave estrangeira para manter a integridade referencial. Veja como fazer:

    CREATE TABLE orders (
        order_id INT PRIMARY KEY,
        customer_id INT,
        order_date DATE,
        FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
    );

    O código acima cria uma tabela chamada ‘orders’ com a chave inteira primária ‘order_id’, outro inteiro ‘customer_id’ e a data ‘order_date’. Nesse caso, a restrição FOREIGN KEY é adicionada à coluna ‘customer_id’ e referencia o ‘customer_id’ em sua tabela ‘customers’.

    Criando uma chave estrangeira após criar uma tabela

    Suponha que você já tenha criado uma tabela e queira adicionar uma restrição de chave estrangeira; use a instrução `ALTER TABLE` em seu código. Observe o trecho de código abaixo.

    ALTER TABLE orders
    ADD FOREIGN KEY (customer_id) REFERENCES customers(customer_id);

    Nesse caso, você adicionou uma coluna ‘customer_id’ de restrição de chave estrangeira na tabela ‘orders’ para referenciar a coluna ‘customer_id’ na tabela ‘customers’.

    Criando uma chave estrangeira sem verificar os dados existentes

    Quando você adiciona uma restrição de chave estrangeira a uma tabela, o banco de dados verifica automaticamente os dados existentes para garantir a consistência com a restrição. No entanto, se você sabe que os dados são consistentes e deseja adicionar uma restrição sem a verificação de consistência, veja como fazer isso.

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    NOT VALIDATE;

    O comando NOT VALIDATE informa ao banco de dados para não verificar os dados existentes. Este caso particular é útil em casos específicos. Por exemplo, quando você tem dados massivos e deseja concluir o processo de validação.

    Criando uma chave estrangeira via DELETE/UPDATE

    Ao criar restrições de chave estrangeira, você pode direcionar a ação a ser executada nos casos em que a linha referenciada é atualizada ou excluída. Nesse caso, você está usando restrições de integridade referencial em cascata para ditar as ações a serem tomadas. Eles incluem:

      Como ligar e desligar seu Mac

    #1. SEM AÇÃO

    Como em muitos outros bancos de dados, a regra ‘NO ACTION’ é o comportamento padrão quando você cria uma restrição de chave estrangeira. Isso significa que nenhuma ação é executada quando a linha referenciada é excluída ou atualizada.

    O Mecanismo de Banco de Dados gerará um erro se a restrição de chave estrangeira for violada. No entanto, isso não é recomendado porque pode levar a problemas de integridade referencial, pois a restrição de chave estrangeira precisa ser aplicada. Aqui está um exemplo de como fazer:

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION;

    #2. CASCATA

    A regra ‘CASCADE’ é outra opção para as ações ‘ON DELETE’ e ‘ON UPDATE’ ao criar restrições de chave estrangeira. Quando implementado, significa que sempre que uma linha é atualizada ou excluída nas tabelas pai, as linhas referenciadas são atualizadas ou excluídas de acordo. Essa técnica é poderosa ao manter a integridade referencial. Aqui está um exemplo:

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE CASCADE
    ON UPDATE CASCADE;

    Você deve estar atento ao usar esta regra, pois ela pode causar consequências indesejáveis ​​se não for usada com cuidado. Você deseja evitar a exclusão acidental de muitos dados ou a criação de referências circulares. Portanto, use esta opção apenas se necessário e com cautela.

    Existem algumas regras sobre o uso do CASCADE:

    • Você não pode especificar CASCADE se uma coluna de registro de data e hora fizer parte da chave estrangeira ou referenciada.
    • Se sua tabela tiver um gatilho INSTEAD OF DELETE, você não poderá especificar ON DELETED CASCADE.
    • Você não pode especificar ON UPDATE CASCADE se sua tabela tiver o gatilho INSTEAD OF UPDATE.

    #3. DEFINIR NULO

    Quando você exclui ou atualiza uma linha correspondente na tabela pai, todos os valores que compõem a chave estrangeira são definidos como nulos. Essa regra de restrição exige que as colunas de chave estrangeira sejam anuláveis ​​para execução e não podem ser especificadas para tabelas com gatilhos INSTEAD OF UPDATE. Aqui está um exemplo de como fazê-lo.

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE SET NULL
    ON UPDATE SET NULL

    Nesse caso, você definiu a coluna de chave estrangeira ‘customer_id’ na tabela “orders” como nula se a linha correspondente na tabela “customers” for excluída ou atualizada.

    #4. CONJUNTO PADRÃO

    Aqui, você está definindo todos os valores que tornam a chave estrangeira padrão, desde que a linha referenciada na tabela pai seja atualizada ou excluída.

    Essa restrição será executada se todas as colunas de chave estrangeira tiverem definições padrão. Se uma coluna for anulável, seu valor padrão será definido como NULL. Observe que esta opção não pode ser especificada para tabelas com gatilhos INSTEAD OF UPDATE. Aqui está um exemplo:

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE SET DEFAULT
    ON UPDATE SET DEFAULT;

    No caso acima, você definiu o ‘customer_id’ na tabela “orders” para seu valor padrão, o que acontece quando a linha correspondente na tabela “customers” é excluída ou atualizada.

    Palavras Finais

    Neste guia, você recapitulou as restrições de chave primária e se aprofundou nas restrições de chave estrangeira. Você também encontrou várias técnicas para criar restrições de chave estrangeira. E embora existam muitas maneiras de criar restrições de chave estrangeira, esta postagem desvendou os métodos.

    E esperando que você tenha aprendido novas técnicas; você não está limitado a combiná-los. Por exemplo, os métodos de restrição CASCADE, SET NULL, SET DEFAULT e NO ACTION podem ser combinados em tabelas com relações referenciais.

    Se sua tabela encontrar NO ACTION, ela retornará para outras regras de restrição. Em outros casos, uma ação DELETE pode acionar uma combinação dessas regras e a regra NO ACTION será executada por último.

    Em seguida, confira a folha de dicas do SQL.