Pular para o conteúdo principal

SQL ON DELETE CASCADE: Remover automaticamente dados dependentes

Entenda como o SQL ON DELETE CASCADE automatiza exclusões dependentes no SQL, mantém as tabelas consistentes e ajuda a evitar a perda acidental de dados.
Atualizado 16 de jan. de 2026  · 9 min lido

Apagar dados no SQL não é só tirar uma única linha. Em um banco de dados relacional, as tabelas geralmente estão interligadas, e uma exclusão em uma tabela pode afetar outras tabelas. Para gerenciar isso com segurança, o SQL usa restrições de chave estrangeira para definir como os dados relacionados devem se comportar quando as linhas são excluídas ou atualizadas.

Uma das opções de exclusão mais poderosas é a restrição SQL “ ON DELETE CASCADE ”. Em vez de bloquear uma exclusão ou deixar registros órfãos para trás, essa regra diz ao banco de dados para remover automaticamente todas as linhas filhas dependentes quando uma linha pai referenciada é excluída.

ON DELETE CASCADE Neste tutorial, vou mostrar como funciona a restrição ON DELETE ALL, por que os bancos de dados suportam exclusões em cascata automáticas e quando essa é a escolha certa em comparação com regras mais restritivas,como ON DELETE RESTRICT.  Sevocê é novo no SQL, comece com nosso curso Introdução ao SQL ou, se já tem alguma experiência, vá direto para o curso SQL Intermediário. 

O que é ON DELETE CASCADE no SQL?

Para entender como funciona a restrição de chave estrangeira ` ON DELETE CASCADE `, vou primeiro explicar a integridade referencial e a cláusula ` CASCADE `.

Integridade referencial e chaves estrangeiras

Em bancos de dados relacionais, as tabelas são conectadas por meio de chaves estrangeiras, que ligam uma coluna em uma tabela (a tabela filha) a uma chave primária em outra tabela (a tabela pai). As chaves estrangeiras garantem a integridade referencial para que uma linha filha sempre aponte para uma linha pai válida. 

Sem essa aplicação, os bancos de dados poderiam facilmente acabar com registros órfãos, onde as linhas fazem referência a dados que não existem mais. Então, as regras de exclusão existem pra dizer ao banco de dados exatamente como lidar com esses órfãos antes mesmo que eles apareçam.

O que CASCADE realmente significa

No SQL, a restrição “ ON DELETE CASCADE ” diz ao banco de dados para apagar automaticamente todas as linhas filhas que fazem referência à linha pai apagada. Isso aciona a operação de forma recursiva por meio de cadeias de chaves estrangeiras, excluindo dados dependentes em uma transação atômica e e.

Por exemplo, você pode excluir um registro de cliente no banco de dados, e isso faz com que seus pedidos sejam apagados, o que, por sua vez, exclui os itens do pedido em uma única consulta.

Como o ON DELETE CASCADE funciona na prática

Agora que você já entendeu o que o CASCADE faz, vamos ver como o banco de dados aplica a lógica.

Relações entre tabelas pai e filho

Como você já sabe, as relações de banco de dados têm uma tabela que funciona como pai, guardandoa chave primária, enquanto outra funciona como filho, guardando essa chave como uma chave estrangeira. Quando você consulta uma instrução ` DELETE ` na tabela pai, o mecanismo do banco de dados primeiro verifica as restrições de chave estrangeira para identificar todos os dependentes `` por meio de indexação paraaumentar a velocidade.

O que rola quando uma linha pai é apagada?

Quando você executa um comando ` DELETE ` em uma linha pai, o banco de dados pausa a execução final para verificar suas regras de chave estrangeira na seguinte ordem:

  • Identificação: O motor olha o índice da chave estrangeira para encontrar todas as linhas nas tabelas filhas que correspondem ao ID que está sendo excluído.
  • Execução: Antes (ou durante) a remoção da linha pai, o mecanismo exclui as linhas filhos identificadas.
  • Validação: O banco de dados garante que não fiquem linhas órfãs. Se todas as exclusões derem certo, a transação está finalizada.

É bom lembrar que o processo acima só vai rolar se você tiver definido a restrição ON DELETE CASCADE, como vamos ver mais adiante neste artigo.

ON DELETE CASCADE vs. Outras regras de exclusão

No SQL, existem diferentes regras de restrição de chave estrangeira ( DELETE ) que dizem ao banco de dados como lidar com os dados relacionados a diferentes tabelas. Nesta seção, vamos comparar o ON DELETE CASCADE com essas restrições.

CASCADE vs. RESTRINGIR

Pela explicação acima, vemos que um CASCADE e automaticamente exclui todas as linhas filhas dependentes quando uma linha pai é removida, garantindo que nenhum registro órfão permaneça.

Mas, a restrição SQL “ RESTRICT ” bloqueia totalmente a operação de exclusão se alguma linha filha ainda fizer referência à linha pai. Essa operação garante que não haja perda acidental de dados. No exemplo abaixo, a restrição “ RESTRICT ” (não pode excluir se houver ordens) impede a exclusão de um cliente se houver ordens que façam referência a ele.

-- Parent table
CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    name VARCHAR(100)
);

-- Child table with ON DELETE RESTRICT
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    CONSTRAINT fk_orders_customers
        FOREIGN KEY (customer_id)
        REFERENCES customers(customer_id)
        ON DELETE RESTRICT
);

CASCADE vs. SET NULL e SET DEFAULT

Enquanto CASCADE remove totalmente as linhas dependentes, SET NULL e SET DEFAULT mantêm as linhas secundárias das seguintes maneiras:

Quando você define sua restrição como “ ON DELETE SET NULL ”, a linha pai é excluída, mas os valores da chave estrangeira na tabela filho são definidos como “ NULL ”.

No exemplo abaixo, excluir um cliente não remove os pedidos associados. Em vez disso, a coluna “ customer_id ” na tabela “ orders ” é automaticamente definida como “ NULL ”. Isso mantém os registros dos pedidos, mas corta a ligação com o cliente que foi excluído.

-- Child table using ON DELETE SET NULL
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT NULL,
    CONSTRAINT fk_orders_customers
        FOREIGN KEY (customer_id)
        REFERENCES customers(customer_id)
        ON DELETE SET NULL
);

Da mesma forma, com a opção “ SET DEFAULT ” (Excluir o cliente sem excluir os pedidos), excluir um cliente não remove os pedidos relacionados. Em vez disso, o campo “ customer_id ” na tabela “ orders ” é redefinido para o valor padrão definido. Isso mantém os registros de pedidos intactos enquanto atribui a eles um espaço reservado predefinido.

-- Child table using ON DELETE SET DEFAULT
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT DEFAULT 0,
    CONSTRAINT fk_orders_customers
        FOREIGN KEY (customer_id)
        REFERENCES customers(customer_id)
        ON DELETE SET DEFAULT
);

Criando chaves estrangeiras com ON DELETE CASCADE

Para usar a restrição " ON DELETE RESTRICT " no SQL, você precisa especificá-la ao criar a relação de chave estrangeira entre as tabelas pai e filho.

CASCADE em esquemas de tabelas

Você pode definir a regra " ON DELETE CASCADE " (Exclusão de duplicatas) no SQL ao criar tabelas ou ao modificar tabelas existentes.

O exemplo abaixo mostra como aplicar a restrição de chave estrangeira SQL ` ON DELETE CASCADE ` ao definir uma nova tabela. Com o CASCADE, ao excluir um departamento, todos os funcionários associados a ele são automaticamente removidos.

-- Stores department details
CREATE TABLE departments (
    department_id INT PRIMARY KEY, 
    department_name VARCHAR(100)
);

-- Automatically deletes employees when their department is deleted
CREATE TABLE employees (
    employee_id INT PRIMARY KEY,      -- Unique employee identifier
    department_id INT, 
    CONSTRAINT fk_employees_departments
        FOREIGN KEY (department_id)
        REFERENCES departments(department_id)
        ON DELETE CASCADE
);

Se a tabela já existir, você pode adicionar uma restrição de chave estrangeira com ON DELETE CASCADE. Então, se você excluir um departamento, ele vai apagar automaticamente todos os registros de funcionários relacionados.

-- Adds a foreign key constraint after the table already exists
ALTER TABLE employees
ADD CONSTRAINT fk_employees_departments
FOREIGN KEY (department_id)
REFERENCES departments(department_id)
ON DELETE CASCADE;    -- Deletes employees when the related department is deleted

Cadeias em cascata e exclusões em vários níveis

Uma das coisas legais do CASCADE é que as exclusões não param em um único relacionamento. Se uma tabela filha também for pai de outra tabela, a exclusão pode se espalhar por vários níveis, chamados de cadeias em cascata. Por exemplo, excluir um usuário pode excluir pedidos, o que, por sua vez, exclui itens de pedidos, o que pode excluir linhas de auditoria relacionadas.

Então, é importante documentar e revisar com cuidado os esquemas que usam CASCADE. Como uma única instrução de exclusão pode afetar várias tabelas, é importante entender toda a cadeia de dependências antes de ativar o comportamento em cascata.

Casos comuns de uso para ON DELETE CASCADE

A restrição " ON DELETE CASCADE " no SQL é importante em cenários em que os dados na tabela filho não têm valor sem o registro pai. Vamos ver como isso funciona na prática, na gestão de bancos de dados.

Limpar automaticamente os dados dependentes

Você pode usar o ON DELETE CASCADE para limpar dados onde a limpeza manual seria ineficiente. Isso inclui tabelas como registros, registros históricos, trilhas de auditoria ou tabelas de junção muitos-para-muitos que muitas vezes existem só para dar suporte a um registro pai. Por exemplo:

  • Apagar um usuário deve remover o histórico de login dele.
  • Apagar um pedido deve tirar os itens dele.
  • Apagar um produto deve tirar as entradas da tabela de mapeamento de produtos e categorias.

Simplificando o gerenciamento do ciclo de vida dos dados

Você também pode usar o CASCADE para mover regras do ciclo de vida dos dados para o banco de dados. Em vez de depender do código do aplicativo para encontrar registros relacionados, excluí-los na ordem certa e lidar com casos extremos e falhas, o banco de dados aplica essas regras de forma consistente e atômica.

Assim, CASCADE garante que, não importa como a exclusão seja acionada, seja por um aplicativo, um script ou uma consulta administrativa, o resultado seja sempre consistente.

Riscos e armadilhas do ON DELETE CASCADE

Embora a restrição “ ON DELETE CASCADE ” possa ser útil, ela pode ser arriscada quando usada de forma errada. É importante entender as armadilhas comuns ao projetar restrições eficientes de CASCADE.

Exclusões em massa acidentais

O risco mais comum com o CASCADE é a exclusão acidental em grande escala. Uma única instrução ` DELETE ` em uma tabela pai pode remover silenciosamente centenas ou milhares de linhas relacionadas em várias tabelas. Essa ação pode causar uma perda inesperada de dados que pode ser difícil de recuperar se você não entender direito a relação entre as tabelas. 

Como prática recomendada, certifique-se sempre de poder rastrear a relação entre chaves estrangeiras nas tabelas pai e filho. Se você acertar o esquema, vai saber quais tabelas seriam afetadas por uma única exclusão.

Dependências ocultas em esquemas complexos

À medida que os bancos de dados crescem, as tabelas acumulam chaves estrangeiras adicionais e a documentação pode ficar fora de sincronia com a realidade. O desafio surge quando o CASCADE é implementado nesses ambientes, e as exclusões podem se espalhar por cadeias de dependências bem complexas que os desenvolvedores ou administradores nem imaginam.

Pela minha experiência, recomendo que você combine o CASCADE com uma documentação clara do esquema e uma revisão regular das relações de chaves estrangeiras.

Experimentenossoprograma de habilidades SQL Server para administradores de bancos de dadosse você costuma projetar ou manter bancos de dados como parte do seu trabalho. 

Observações e comportamento específicos do banco de dados

Embora o conceito de “ ON DELETE CASCADE ” seja padrão em bancos de dados relacionais, cada mecanismo lida com a execução subjacente com pequenas diferenças.

Comportamento do PostgreSQL, MySQL e SQL Server

O PostgreSQL, o MySQL e o SQL Serversuportam o comando ` ON DELETE CASCADE ` e implementam-no da mesma forma, com as seguintes exceções:

  • MySQL:CASCADE funciona bem com o InnoDB, mas evita cascatas circulares

  • PostgreSQL: Mais flexível e permissivo com cadeias de exclusão em cascata

  • SQL Server: Mais seguro, mas mais restritivo por causa das várias regras de caminho em cascata

Escopo da transação e segurança de reversão

As exclusões em cascata são feitas na mesma transação que a instrução de exclusão original. Se o banco de dados encontrar um erro ao tentar excluir uma linha secundária, toda a operação falhará. A linha pai não é excluída e quaisquer linhas filhos já removidas são restauradas.

Esse jeito de fazer negócios dá uma segurança importante. Permite que você teste, revise ou reverta exclusões em cascata antes de confirmar.

Escolhendo a estratégia certa para ON DELETE

A essa altura, você já sabe que escolher a estratégia de exclusão certa depende de como seus dados estão relacionados e como você quer que eles se comportem ao longo do tempo. Dá uma olhada nessas dicas pra escolher o DELETE certo pro seu esquema.

Quando o CASCADE é a escolha certa

Você deve usar a restrição " ON DELETE CASCADE " quando os dados filhos dependem totalmente dos pais para terem significado ou existência. Por exemplo, você pode usar isso da seguinte maneira:

  • Junte tabelas em relações muitos-para-muitos
  • Dados temporários ou derivados, como registros ou entradas de histórico

Nesses casos, a limpeza automática garante a consistência e ainda reduz a lógica de exclusão manual necessária na camada de aplicativos.

Recomendo fazer nosso curso Joining Data in SQLpara aprender os diferentes tipos de junções em SQL e como trabalhar com diferentes tabelas relacionadas no banco de dados.

Quando evitar o CASCADE

Mas, você deve evitar a restrição “ ON DELETE CASCADE ” no seu esquema se os dados filhos tiverem um valor independente ou precisarem ser mantidos por motivos legais, de auditoria ou analíticos. Por exemplo, você não pode usar CASCADE em:

  • Registros financeiros e faturas
  • Registros de auditoria e dados de conformidade, como dados de saúde.

Nesses casos, recomendo usar regras restritivas, como RESTRICT, SET NULL ou exclusões gerenciadas por aplicativo para ter mais controle e visibilidade.

Conclusão

A restrição SQL “ ON DELETE CASCADE ” (exclusão por referência) é uma ferramenta de automação poderosa que mantém a integridade referencial removendo automaticamente os dados dependentes quando uma linha pai é excluída. Quando usado da maneira certa, ele simplifica a limpeza, reduz a lógica de exclusão manual e garante um comportamento consistente entre aplicativos e scripts. Para evitar exclusões acidentais, sempre tenha cuidado ao usar CASCADE se você não entender completamente as relações no esquema do banco de dados.

Recomendo fazer nosso curso de Design de Banco de Dados, onde você vai aprender a criar e gerenciar bancos de dados e escolher o DBMS certo para suas necessidades. Também recomendo experimentar nosso programa de Engenheiro de Dados Associado em SQL para aprender os fundamentos da engenharia de dados e do warehouse.  


Allan Ouko's photo
Author
Allan Ouko
LinkedIn
Eu crio artigos que simplificam a ciência e a análise de dados, tornando-as fáceis de entender e acessíveis.

Perguntas frequentes sobre SQL ON DELETE CASCADE

O ON DELETE CASCADE apaga primeiro as linhas filhas ou as linhas pai?

ON DELETE CASCADE exclui primeiro as linhas secundárias para manter a integridade referencial.

Qual é a diferença entre ON DELETE CASCADE e RESTRICT?

CASCADE exclui automaticamente as linhas dependentes, enquanto RESTRICT bloqueia a exclusão se existirem linhas secundárias.

Qual é a diferença entre ON DELETE CASCADE e SET NULL?

CASCADE remove as linhas secundárias; SET NULL mantém-nas, mas limpa a referência da chave estrangeira.

É possível reverter o ON DELETE CASCADE?

Sim, as exclusões em cascata rolam dentro de uma transação, e você pode reverter antes de confirmar.

O ON DELETE CASCADE é o padrão no SQL?

Não, você precisa definir explicitamente ON DELETE CASCADE na restrição de chave estrangeira ao criar uma tabela ou em uma tabela já existente.

Tópicos

Aprenda SQL com o DataCamp

Curso

Introdução aos bancos de dados relacionais em SQL

4 h
181.7K
Saiba como criar uma das formas mais eficientes de armazenamento de dados: os bancos de dados relacionais!
Ver detalhesRight Arrow
Iniciar curso
Ver maisRight Arrow
Relacionado
SQL Programming Language

blog

O que é SQL? - A linguagem essencial para o gerenciamento de bancos de dados

Saiba tudo sobre o SQL e por que ele é a linguagem de consulta ideal para o gerenciamento de bancos de dados relacionais.
Summer Worsley's photo

Summer Worsley

13 min

Tutorial

Introdução aos acionadores SQL: Um guia para desenvolvedores

Saiba como usar os acionadores SQL para automatizar tarefas, manter a integridade dos dados e melhorar o desempenho do banco de dados. Experimente exemplos práticos como os comandos CREATE, ALTER e DROP no MySQL e no Oracle.
Oluseye Jeremiah's photo

Oluseye Jeremiah

Tutorial

Tutorial de visão geral do banco de dados SQL

Neste tutorial, você aprenderá sobre bancos de dados em SQL.
DataCamp Team's photo

DataCamp Team

Tutorial

Tutorial do Insert Into SQL

A instrução "INSERT INTO" do SQL pode ser usada para adicionar linhas de dados a uma tabela no banco de dados.
DataCamp Team's photo

DataCamp Team

Tutorial

SELEÇÃO de várias colunas no SQL

Saiba como selecionar facilmente várias colunas de uma tabela de banco de dados em SQL ou selecionar todas as colunas de uma tabela em uma consulta simples.
DataCamp Team's photo

DataCamp Team

Tutorial

Como usar um alias SQL para simplificar suas consultas

Explore como o uso de um alias SQL simplifica os nomes de colunas e tabelas. Saiba por que usar um alias SQL é fundamental para melhorar a legibilidade e gerenciar uniões complexas.
Allan Ouko's photo

Allan Ouko

Ver maisVer mais