POTHIEDU Não Decore a Resposta. Entenda o Caminho

Chave Estrangeira Banco De Dados

Chave Estrangeira Banco De Dados

O que você realmente precisa saber sobre chaves estrangeiras

Chave estrangeira é apenas uma coluna (ou conjunto de colunas) que referencia a chave primária de outra tabela. Parece óbvio, mas a maioria das pessoas que me perguntam sobre chave estrangeira banco de dados não entende as implicações práticas até receber um erro estranho no meio de uma migração às três da manhã. Quando você cria uma foreign key, o banco de dados começa a fazer trabalho extra em cada INSERT e UPDATE. Isso é esperado. O problema é que muita gente coloca foreign keys em tabelas de milhões de linhas sem indexar corretamente as colunas envolvidas, e o banco acaba travando ou tornando operações simples inviáveis.

Quando criar e quando evitar

Eu trabalhei com um sistema de e-commerce onde tínhamos uma tabela de pedidos com 47 milhões de linhas e outra de produtos com cerca de 200 mil. O desenvolvedor anterior havia colocado foreign keys em todas as colunas relacionais. O banco estava fazendo full table scan a cada insert na tabela de pedidos porque a foreign key referenciava uma coluna não indexada no lado dos produtos. Demoramos cerca de 3 horas para resolver criando um índice específico naquela coluna e ajustando o plano de execução. A regra prática é: se a tabela de referência é pequena e você não faz UPDATEs frequentes nela, manter a foreign key funciona. Se a tabela cresce rápido e recebe atualizações constantes, considere remover a foreign key e validar a integridade em camada de aplicação ou via triggers controladas.

Como configurar corretamente no seu banco

A sintaxe básica varia ligeiramente entre SGBDs, mas o conceito é idêntico. No PostgreSQL, por exemplo: Crie a tabela pai primeiro: CREATE TABLE clientes (
id SERIAL PRIMARY KEY,
nome VARCHAR(100) NOT NULL
);

Identificador (chave primária e estrangeira) · Banco de dados ...
Identificador (chave primária e estrangeira) · Banco de dados ...

Depois a tabela filho com a referência: CREATE TABLE pedidos (
id SERIAL PRIMARY KEY,
cliente_id INTEGER NOT NULL,
valor DECIMAL(10,2),
FOREIGN KEY (cliente_id) REFERENCES clientes(id) ON DELETE RESTRICT
);
O ON DELETE especifica o que acontece quando o registro pai é removido. As opções mais comuns são CASCADE, SET NULL, SET DEFAULT, NO ACTION e RESTRICT. RESTRICT é o padrão em muitos bancos e bloqueia a deleção do pai se houver filhos. NO ACTION permite a deleção em alguns bancos, mas dispara verificação pós-operacional. A diferença técnica entre NO ACTION e RESTRICT existe principalmente no PostgreSQL, onde NO ACTION permite que a restrição seja verificada após gatilhos, enquanto RESTRICT verifica imediatamente.

O erro que todo mundo comete

Pessoas costumam pensar que criar uma foreign key resolve todos os problemas de integridade. Na prática, você precisa garantir que os dados já existam antes de ativar a constraint. Se você tentar criar uma foreign key em uma tabela onde já existem valores na coluna referenciada que não têm correspondência na tabela pai, o banco rejeita a operação. No meu caso mais recente, migrei dados de um sistema legado onde havia mais de 12 mil linhas órfãs em uma tabela de transações. Em vez de deletar tudo manualmente, fiz um UPDATE para colocar NULL em vez de IDs inválidos (quando a coluna permitia), depois criei a foreign key. Quando a coluna não permitia NULL, usei INSERT INTO a tabela de destino para registrar os registros órfãos como "desconhecidos" antes de criar a constraint.

Performance e manutenção

Foreign keys geram locks em tabelas relacionadas durante operações DML. Em ambientes de alta concorrência com escritas simultâneas, isso pode se tornar gargalo. O InnoDB do MySQL, por exemplo, trava linhas nas duas tabelas envolvidas. Se você tem processos batch que processam milhares de registros por vez, considere desabilitar a verificação temporariamente com SET FOREIGN_KEY_CHECKS=0 (no MySQL) ou ALTER TABLE ... DISABLE KEY (em alguns bancos), executando o batch e reativando depois. Para monitoramento, consulte as views de sistema do seu SGBD. No PostgreSQL, a tabela pg_constraint mostra todas as foreign keys. No SQL Server, use sys.foreign_keys combinado com sys.foreign_key_columns. Isso ajuda a identificar quais constraints existem sem precisar analisar todo o schema visualmente.

Chave Estrangeira Banco De Dados - RETOEDU
Chave Estrangeira Banco De Dados - RETOEDU

Documentação e versionamento

Uma prática que economiza tempo é documentar suas foreign keys em migration scripts versionados. Ferramentas como Flyway, Liquibase ou as migrações do Entity Framework mantêm histórico de quando cada constraint foi adicionada ou removida. Isso evita que colegas (ou você mesmo em seis meses) fiquem perguntando por que determinada relação não existe mais no esquema. Se o seu projeto cresceu e você precisa revisar todas as foreign keys existentes, um script utilitário no PostgreSQL seria: SELECT
tc.table_name,
kcu.column_name,
ccu.table_name AS referenced_table,
ccu.column_name AS referenced_column
FROM information_schema.table_constraints tc
JOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name
JOIN information_schema.constraint_column_usage ccu ON tc.constraint_name = ccu.constraint_name
WHERE tc.constraint_type = 'FOREIGN KEY';

Esse tipo de consulta mostra rapidamente quais relações estão definidas e onde podem existir inconsistências entre tabelas que deveriam estar conectadas.