FOREIGN KEY e ações referenciais
Relacione tabelas com FOREIGN KEY e escolha ON DELETE CASCADE / SET NULL / RESTRICT conforme o comportamento adequado.
FOREIGN KEY e ações referenciais é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
O que uma FOREIGN KEY faz
Uma FOREIGN KEY faz o banco de dados recusar linhas que apontem para registros pai inexistentes:
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id),
total NUMERIC(10,2) NOT NULL
);
-- Inserting an order with user_id=999 fails if no such user exists.Por que usar FOREIGN KEY?
As FK impõem a integridade referencial:
- Nenhuma linha órfã
- Capturam erros do aplicativo no momento da inserção
- Tornam os diagramas ER precisos
- Permitem o comportamento de cascata automático
Ações referenciais
O que deve acontecer quando a linha pai é excluída ou atualizada? Há cinco opções:
NO ACTION— erro (padrão, adiável)RESTRICT— erro (não adiável)CASCADE— também exclui ou atualiza o registro filhoSET NULL— define a FK do filho como NULLSET DEFAULT— define a FK do filho como seu valor DEFAULT
ON DELETE CASCADE
"Quando o usuário for excluído, exclua também os pedidos dele":
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL
REFERENCES users(id) ON DELETE CASCADE,
total NUMERIC(10,2) NOT NULL
);ON DELETE SET NULL
"Quando o gerente for removido, os funcionários continuarão existindo, mas perderão o gerente":
CREATE TABLE employees (
id BIGSERIAL PRIMARY KEY,
full_name TEXT NOT NULL,
manager_id BIGINT REFERENCES employees(id) ON DELETE SET NULL
);Padrão: semelhante a RESTRICT
Sem uma ação referencial, tentar excluir um registro pai que tenha filhos falha:
ERROR: update or delete on table "users" violates foreign key constraint "orders_user_id_fkey" on table "orders"
DETAIL: Key (id)=(42) is still referenced from table "orders".Sempre indexe a coluna da FK
O PostgreSQL NÃO cria automaticamente um índice no lado filho. Adicione um — sem ele, excluir um registro pai provoca uma varredura completa de toda a tabela filha:
CREATE INDEX orders_user_id_idx ON orders(user_id);FOREIGN KEYs compostas
Faça referência a uma chave primária composta:
CREATE TABLE order_items (
order_id BIGINT,
line_no INT,
PRIMARY KEY (order_id, line_no)
);
CREATE TABLE shipments (
order_id BIGINT,
line_no INT,
FOREIGN KEY (order_id, line_no)
REFERENCES order_items(order_id, line_no)
);Adiar verificações de FOREIGN KEY
Às vezes é necessário inserir um par em que cada registro depende do outro. Marque a FK como DEFERRABLE INITIALLY DEFERRED:
ALTER TABLE orders
ALTER CONSTRAINT orders_user_id_fkey DEFERRABLE INITIALLY DEFERRED;
BEGIN;
INSERT INTO orders ... ; -- FK temporarily not checked
INSERT INTO users ... ;
COMMIT; -- checked hereAdicionando FOREIGN KEYs sem indisponibilidade
Em tabelas grandes, use NOT VALID + VALIDATE para evitar um bloqueio prolongado:
ALTER TABLE orders
ADD CONSTRAINT orders_user_id_fkey
FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
ALTER TABLE orders VALIDATE CONSTRAINT orders_user_id_fkey;Use CASCADE com cuidado
As exclusões em CASCADE se propagam. Excluir um usuário pode apagar pedidos, pagamentos e registros de auditoria. Certifique-se de que a cascata corresponda à intenção do seu negócio.
Recapitulação
As chaves estrangeiras são barreiras de proteção.
- REFERENCES + ação declara a relação e o comportamento
- Indexe a coluna da FK no registro filho
- Use NOT VALID + VALIDATE para adições sem indisponibilidade
Verificação rápida
Qual é a ação referencial correta para remover AUTOMATICALLY um pedido quando o usuário pai for excluído?
Perguntas Frequentes
A aula “FOREIGN KEY e ações referenciais” é grátis?
Sim — o texto completo de “FOREIGN KEY e ações referenciais” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “FOREIGN KEY e ações referenciais”?
Relacione tabelas com FOREIGN KEY e escolha ON DELETE CASCADE / SET NULL / RESTRICT conforme o comportamento adequado. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “FOREIGN KEY e ações referenciais”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Restrições NOT NULL e CHECK
- Restrições UNIQUE e chaves compostas
- FOREIGN KEY e ações referenciais
- Valores DEFAULT e colunas geradas