0Pricing
SQL Academy · Aula

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 filho
  • SET NULL — define a FK do filho como NULL
  • SET 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 here

Adicionando 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

  1. Restrições NOT NULL e CHECK
  2. Restrições UNIQUE e chaves compostas
  3. FOREIGN KEY e ações referenciais
  4. Valores DEFAULT e colunas geradas
← Voltar para SQL Academy