Pular para o conteúdo principal

SQL ON DELETE RESTRICT: Evite a perda acidental de dados

Entenda como o SQL ON DELETE RESTRICT protege a integridade dos dados. Aprenda como ele bloqueia exclusões inseguras e quando escolher essa opção em vez das regras CASCADE ou SET NULL.
Atualizado 16 de jan. de 2026  · 10 min lido

Apagar dados no SQL geralmente não é tão simples quanto tirar uma única linha. Em bancos de dados relacionais, as tabelas geralmente estão conectadas, e excluir um registro em uma delas pode afetar outra tabela. 

O SQL tem a cláusula ` ON DELETE `, que define o que deve acontecer quando uma linha referenciada é excluída. Depois da cláusula ` ON DELETE `, você pode dizer o que vai acontecer, tipo bloquear a exclusão, tirar automaticamente a linha dependente ou atualizar os dados referenciados.

Neste tutorial, vou mostrar a restrição “ ON DELETE RESTRICT ”, que impede a exclusão de uma linha pai se ainda houver linhas filhas dependentes. Também vou falar bastante sobre como a restrição funciona, por que os bancos de dados a aplicam e quando ela é a escolha certa em comparação com outras regras de exclusão. Por fim, se você estiver procurando o comportamento oposto — em que a exclusão de uma linha pai remove automaticamente os registros relacionados — consulte nosso guia em SQL ON DELETE CASCADE.

O que é ON DELETE RESTRICT no SQL?

A restrição " ON DELETE RESTRICT " no SQL é um recurso de segurança do banco de dados. Isso garante que você não possa excluir um registro “pai” se ainda houver registros “filhos” apontando para ele.

Observação: Enquanto bancos de dados como PostgreSQL e MySQL suportam diretamente a palavra-chave ` RESTRICT `, o SQL Server impõe o mesmo comportamento de restrição usando ` ON DELETE NO ACTION `.

Integridade referencial e chaves estrangeiras

A integridade referencial é o princípio de que as relações entre tabelas devem permanecer válidas o tempo todo. As chaves estrangeiras fazem isso exigindo que os valores em uma tabela filha correspondam às linhas existentes em uma tabela pai. Por exemplo, um campo “ DepartmentID ” na tabela “ Employees ” pode fazer referência a um campo específico “ ID ” na tabela “ Departments ”.

Então, as regras de SQL ( DELETE ) existem porque tirar uma linha pai pode quebrar essa relação. O banco de dados precisa de instruções claras sobre se deve bloquear a exclusão, aplicá-la em cascata ou fazer outra coisa com as linhas dependentes.

O que RESTRICT realmente significa

Quando você define uma chave estrangeira com um ON DELETE RESTRICT, o banco de dados verifica se há linhas filhas relacionadas antes de executar uma exclusão. Se existir um registro filho, a operação de exclusão será rejeitada automaticamente.  Nesse caso, o comando ` RESTRICT ` impede que a exclusão aconteça, em vez de modificar os dados, como veremos mais adiante no tutorial.

Como funciona ON DELETE RESTRICT no SQL

Para entender como funciona a restrição “ ON DELETE RESTRICT ”, você precisa ver como o banco de dados avalia as exclusões passo a passo durante uma transação.

Relações entre tabelas pai e filho

No SQL, a tabela pai guarda os registros principais, enquanto a tabela filha guarda os registros dependentes. Por exemplo, seu banco de dados pode ter uma tabela pai Categories com uma category_id de “Electronics”. A tabela secundária Products vai ter um registro “Smartphone”, que vai ser conectado à tabela principal usando o category_id.

Quando você executa um comando ` DELETE ` na tabela pai, o mecanismo do banco de dados imediatamente verifica todas as tabelas filhas associadas para ver se alguma linha está apontando para esse ID pai específico.

O que rola quando você tenta apagar linhas restritas?

Se você tentar excluir uma linha pai que ainda está sendo referenciada, o banco de dados interrompe a operação e gera um erro. Essa mensagem de erro mostra que rolou uma violação de uma restrição de chave estrangeira.

Esse comportamento é de propósito, te forçando a decidir se quer apagar ou atualizar primeiro as linhas filhas dependentes ou repensar se a linha pai deve mesmo ser removida.

O SQL ON DELETE RESTRICT vs. Outras regras de exclusão

Em um DBMS, existem regras específicas que controlam como os dados podem ser apagados das tabelas relacionadas. Nesta seção, vamos comparar a restrição “ ON DELETE RESTRICT ” com as regras comuns de exclusão no SQL, para que você possa ver claramente como cada uma delas afeta os dados relacionados.

RESTRITIVO vs. CASCADE em SQL

A restrição SQL “ RESTRICT ” impede a exclusão da linha pai se as linhas filhos fizerem referência a ela, garantindo que não haja perda acidental de dados. A consulta a seguir mostra como implementar um RESTRICT o ao definir o esquema da tabela. Isso evita que um cliente seja excluído se houver pedidos 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
);

Mas, a restrição SQL “ CASCADE ” garante que uma exclusão apague automaticamente todas as linhas filhas dependentes. No exemplo abaixo, CASCADE permite a exclusão automática de todos os pedidos associados a um cliente quando o registro do cliente é excluído.

-- Child table with ON DELETE CASCADE
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 CASCADE
);

RESTRITIVO vs. SET NULL e SET DEFAULT

As restrições SQL SET NULL e SET DEFAULT mantêm as linhas filhas, mas mudam como elas se referem à linha pai.

Por exemplo, na consulta abaixo, quando um cliente é excluído, o campo “ customer_id ” (Cliente associado) nos pedidos relacionados é definido como “ NULL ” (Sem cliente associado), mantendo os registros dos pedidos, mas removendo o link para o cliente.

-- Child table using 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
);

Se você usar a restrição “ SET DEFAULT ”, quando um cliente for excluído, o campo “ customer_id ” nos pedidos relacionados será definido como seu valor padrão, preservando os registros dos pedidos e atribuindo a eles um valor de espaço reservado predefinido.

-- Child table using 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 RESTRICT em SQL

Para implementar a restrição " ON DELETE RESTRICT " no SQL, você precisa defini-la ao criar a relação entre duas tabelas.

Definindo RESTRICT em esquemas de tabelas

Você pode definir o comportamento de exclusão no SQL ao criar a tabela ou adicioná-lo depois, se a sua tabela já existir.

O exemplo abaixo mostra como usar a restrição de chave estrangeira SQL ` ON DELETE RESTRICT ` na instrução ` CREATE TABLE ` ao definir uma nova tabela no SQL.

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

-- -- Prevents deleting a department with employees
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 RESTRICT 
);

A consulta abaixo adiciona a mesma regra de chave estrangeira a uma tabela existente employees na instrução SQL ALTER TABLE, para impedir a exclusão de departamentos que ainda são referenciados por funcionários.

-- 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 RESTRICT;    -- Blocks deletion of departments that have employees

Comportamento padrão de exclusão no SQL

Em muitos sistemas de banco de dados populares, como SQL Server, PostgreSQL e MySQL, o comportamento padrão é o “ RESTRICT ”. Se você definir uma chave estrangeira sem especificar nenhuma cláusul ON DELETE, o banco de dados geralmente vai agir como se você tivesse escrito ON DELETE NO ACTION ou ON DELETE RESTRICT. Esse design do mecanismo de banco de dados garante que você receba uma mensagem de erro em vez de excluir acidentalmente grandes quantidades de dados relacionados.

Casos comuns de uso do ON DELETE RESTRICT no SQL

Em cenários reais, a restrição SQL “ ON DELETE RESTRICT ” é aplicada quando a integridade dos dados exige uma supervisão explícita antes das exclusões.

Protegendo dados de referência importantes

A restrição SQL “ RESTRICT ” é normalmente usada para tabelas que representam dados de referência essenciais, como usuários, contas, produtos ou valores de pesquisa. Esses registros costumam ser compartilhados em várias partes do sistema, e apagá-los automaticamente pode causar perda generalizada de dados ou inconsistências.

Por exemplo, excluir um usuário que ainda possui pedidos, registros de auditoria ou permissões geralmente não é seguro. Com a restrição SQL “ ON DELETE RESTRICT ”, o banco de dados bloqueia a exclusão e faz com que você resolva essas dependências primeiro, mantendo a integridade dos dados históricos e transacionais.

Aplicando fluxos de trabalho de limpeza explícitos

A restrição SQL “ RESTRICT ” também é útil quando você quer que a limpeza seja intencional e rastreável. Isso faz com que os desenvolvedores e administradores tenham que pensar bem sobre como lidam com os dados. Em vez de deixar o banco de dados apagar registros automaticamente, a restrição “ RESTRICT ” faz com que você precise dar uma olhada nos dados dependentes para decidir se vai apagar os registros filhos, reatribuí-los a um novo pai ou cancelar a operação.

Resolução de problemas de erros DELETE causados por RESTRICT no SQL

Quando a restrição " ON DELETE RESTRICT " bloqueia uma exclusão, o erro resultante pode ser confuso se você não estiver esperando por ele. Entender esses erros ajuda você a resolvê-los com segurança.

Entendendo os erros de violação de restrições

Quando você tenta excluir uma linha pai que ainda é referenciada, o banco de dados gera uma violação de restrição de chave estrangeira. A seguir, veja como a mensagem vai aparecer em diferentes sistemas de banco de dados:

  • PostgreSQL: ERROR: update or delete on table "parent_table" violates foreign key constraint "fk_name" on table "child_table"

  • MySQL: Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails…

  • SQL Server: The DELETE statement conflicted with the REFERENCE constraint "FK_Name". The conflict occurred in database "DBName", table "dbo.ChildTable", column 'ParentID'.

Em todos os bancos de dados, a mensagem de erro vai dizer o seguinte:

  • Qual restrição de chave estrangeira foi violada
  • Qual tabela está atuando como filho?
  • Qual valor-chave ainda está sendo usado como referência?

Resolvendo com segurança exclusões bloqueadas

Se você receber uma mensagem de erro de exclusão bloqueada, mas quiser excluir a linha pai, recomendo usar uma das seguintes opções:

Primeiro, apaga o registro filho: Se os dados dependentes não forem mais necessários, execute primeiro uma instrução ` DELETE ` nas linhas filhas e, em seguida, exclua o registro pai.

-- Step 1: Remove dependencies
DELETE FROM Orders WHERE CustomerID = 501; 
-- Step 2: Now the parent delete will work
DELETE FROM Customers WHERE CustomerID = 501;

Atualizar referências secundárias: Se você quiser manter as linhas filhas, mas remover a linha pai, atualize as linhas filhas para referenciar um ID pai diferente.

-- Reassign orders to a "General" customer account (ID 999)
UPDATE Orders SET CustomerID = 999 WHERE CustomerID = 501;

Altere a restrição: Em casos raros de administração, você pode desativar temporariamente as verificações de chaves estrangeiras. Essa é uma operação arriscada que pode danificar os dados se não for feita com muito cuidado.

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

Embora o conceito de restrição “ ON DELETE RESTRICT ” no SQL seja padrão em todos os bancos de dados SQL, diferentes mecanismos lidam com o tempo e a lógica interna de maneiras ligeiramente diferentes.

Comportamento do PostgreSQL, MySQL e SQL Server

No PostgreSQL, MySQL e SQL Server, a restrição " ON DELETE RESTRICT " (não pode excluir se houver referências ativas) impede a exclusão de uma linha pai quando existem linhas filhas relacionadas. Mas, esses motores têm umas pequenas diferenças de sintaxe:

MySQL: Segue rigorosamente as restrições SQL RESTRICT. Se você não especificar uma regra, o padrão será RESTRICT.

-- MySQL: RESTRICT is the default if no rule is specified
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    FOREIGN KEY (customer_id)
        REFERENCES customers(customer_id)
);

PostgreSQL: Suporta restrições de tipo " RESTRICT " e " NO ACTION ". Embora funcionem quase da mesma forma, RESTRICT é estritamente imediato, enquanto NO ACTION permite verificações adiadas.

-- PostgreSQL: NO ACTION (can be deferred)
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    FOREIGN KEY (customer_id)
        REFERENCES customers(customer_id)
        ON DELETE NO ACTION
);

SQL Server: Usa uma restrição ` NO ACTION ` como equivalente ao comportamento padrão ` RESTRICT `. Ele não usa explicitamente a palavra-chave ` RESTRICT ` na sintaxe T-SQL, mas consegue o mesmo resultado ao impedir a exclusão.

-- SQL Server: Uses NO ACTION instead of 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 NO ACTION
);

Recomendo fazernossos cursos Introdução ao SQL Server e Criação de bancos de dados PostgreSQL paraaprender mais sobre as diferenças entre os dialetos SQL na hora de criar bancos de dados.

Restrições diferidas e comportamento das transações

Em configurações avançadas de banco de dados, como no PostgreSQL ou Oracle, você pode encontrar restrições diferidas. Isso quer dizer que a restrição é verificada no momento da confirmação da transação, e não imediatamente quando a instrução ` DELETE ` é executada.

Nesses sistemas, uma exclusão que normalmente seria bloqueada por um RESTRICT e pode parecer ter sido bem-sucedida temporariamente dentro de uma transação, mas falhará quando você tentar confirmar. Isso permite operações complexas e com várias etapas, como excluir e reinserir dados relacionados na mesma transação, sem deixar de garantir a integridade no final.

Nossa Introdução ao Oracle SQL vai te ajudar a entender melhor como o Oracle processa consultas.

Escolhendo a estratégia certa para ON DELETE

Escolher a restrição certa ajuda a encontrar um equilíbrio entre a integridade dos dados e a usabilidade do aplicativo. Dá uma olhada nesses cenários pra te ajudar a escolher o método certo com a cláusula ` ON DELETE `.

Quando RESTRICT é a escolha mais segura

Use a restrição SQL " ON DELETE RESTRICT " quando:

  • Os dados são super importantes: Os registros principais são importantes e muito usados no banco de dados.

  • É preciso fazer uma revisão manual: Você quer forçar uma pessoa ou uma lógica de negócios específica a decidir o que vai acontecer com os dados dependentes.

  • Evitar exclusões “silenciosas”: Você quer garantir que um desenvolvedor não apague acidentalmente milhares de linhas com uma única instrução ` CASCADE `.

Sugiro que você experimente o SQL Server para Administradores de Banco de Dados se você costuma projetar ou manter bancos de dados como parte do seu trabalho. 

Quando pensar em alternativas

Se a restrição RESTRICT for muito rígida para o seu sistema, pense nessas opções:

  • Use a restrição “ CASCADE ” quando o registro filho não fizer sentido sem o registro pai.

  • Use a restrição " SET NULL " quando a relação for opcional.

  • Use a restrição “ SET DEFAULT ” quando tiver um “placeholder” que deve herdar todos os registros órfãos para manter o sistema funcionando bem.

Conclusão

A restrição SQL “ ON DELETE RESTRICT ” é uma regra de chave estrangeira protetora que prioriza a integridade dos dados em vez da conveniência, bloqueando a exclusão de linhas pai quando ainda existem registros filhos dependentes. Ao incentivar estratégias de limpeza bem pensadas e responsabilidade clara pelas operações de exclusão, a restrição SQL “ RESTRICT ” funciona como um recurso de segurança no design relacional. Como prática recomendada, sempre escolha regras de exclusão SQL com base na lógica de negócios e na semântica dos dados, em vez de usar as configurações padrão por conveniência ou necessidades de curto prazo.

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 RESTRICT

Qual é a diferença entre RESTRICT e NO ACTION?

Na maioria dos bancos de dados, eles funcionam da mesma forma. RESTRICT verifica imediatamente, enquanto NO ACTION pode ser verificado no final da instrução ou transação.

O que rola quando eu tento apagar uma linha pai restrita?

A operação ` DELETE ` falha e o banco de dados gera um erro de violação de restrição de chave estrangeira.

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

RESTRICT bloqueia totalmente a exclusão, enquanto CASCADE exclui automaticamente todas as linhas filhas dependentes.

Como faço pra resolver um DELETE bloqueado por ON DELETE RESTRICT?

Como faço pra resolver um DELETE bloqueado por ON DELETE RESTRICT?

Posso alterar uma chave estrangeira existente para usar ON DELETE RESTRICT?

Sim. Você pode excluir e recriar a restrição de chave estrangeira com ON DELETE RESTRICT usando ALTER TABLE.

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

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

Tutorial do SQL Server: Desbloqueie o poder do gerenciamento de dados

Explore o gerenciamento de dados com nosso tutorial do SQL Server. Do básico ao uso avançado, aprimore suas habilidades e navegue no SQL Server com confiança.

Kevin Babitz

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

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

Entendendo a função SQL DECODE()

Saiba como usar DECODE() no Oracle para lógica condicional na transformação de dados. Compare DECODE() com a instrução CASE WHEN em termos de desempenho e comportamento.
Allan Ouko's photo

Allan Ouko

Ver maisVer mais