Base de Conhecimento

Erro 1452 MySQL: foreign key constraint, como resolver

  • mysql, erro 1452, foreign key, chave estrangeira, innodb, sql
  • Usuários acharam útil: 0

Entenda o erro 1452 do MySQL, veja a restrição com SHOW CREATE TABLE, ache as linhas órfãs e corrija inserindo o pai antes ou ajustando o valor da filha.

Por Redação Eleven Host · @robson.direitodigital · 30 de outubro de 2026 · 8 min de leitura

Arte da Eleven Host: janela de terminal com o título: Erro 1452 MySQL: foreign key constraint, como resolver

Capa da Redação Eleven Host para o guia: Erro 1452 MySQL: foreign key constraint, como resolver Arte: Eleven Host

O erro 1452 MySQL aparece quando você insere ou atualiza uma linha que aponta, pela chave estrangeira, para um registro que não existe na tabela pai. Para resolver, crie o pai primeiro ou corrija o valor da filha.

Este guia mostra como ler a mensagem, ver a restrição, achar as linhas sem pai e corrigir cada caso. Os fatos sobre o erro vêm do manual do MySQL 8.4; os exemplos usam as tabelas parent e child, as mesmas do manual. Troque pelos nomes das suas.

A mensagem completa e o que cada parte diz

No manual de erros do MySQL, o erro 1452 tem o símbolo ER_NO_REFERENCED_ROW_2, o SQLSTATE 23000 e esta mensagem:

Cannot add or update a child row: a foreign key constraint fails

Na tela, a mensagem aparece algo como isto, com o número do erro e o detalhe do servidor entre parênteses:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (...)

O trecho entre parênteses é preenchido pelo servidor; aqui ele aparece como reticências. Lendo a mensagem por partes:

  • 1452 e ER_NO_REFERENCED_ROW_2: o número e o símbolo do erro.
  • 23000: o SQLSTATE informado pelo manual.
  • Cannot add or update a child row: o servidor não consegue adicionar nem atualizar uma linha da tabela filha.
  • a foreign key constraint fails: a restrição de chave estrangeira falhou.

Em linguagem simples: a linha que você quer gravar aponta para um pai que não existe.

Uma chave estrangeira liga a tabela filha à tabela pai. O MySQL recusa o INSERT ou o UPDATE que criaria, na filha, um valor sem valor correspondente no pai.

Quando o erro acontece

Segundo o manual, a restrição é definida na tabela filha, e o MySQL recusa um INSERT ou um UPDATE que tente criar nela um valor de chave estrangeira sem correspondente na tabela pai. Isso leva a estas situações:

  • INSERT na filha antes do pai: o InnoDB devolve o erro quando você tenta adicionar uma linha e a linha pai não existe.
  • UPDATE na filha para um valor sem pai: você troca o parent_id de uma linha por um número que não está na tabela pai.
  • Carga de tabelas fora de ordem: ao recarregar tabelas, como na importação de um dump, a ordem exigida pelas relações precisa ser respeitada. A filha não pode entrar antes do pai.

O exemplo da documentação mostra a estrutura. A tabela child tem a coluna parent_id, que aponta para parent(id):

CREATE TABLE parent (

id INT NOT NULL,

PRIMARY KEY (id)

) ENGINE=INNODB;

CREATE TABLE child (

id INT,

parent_id INT,

INDEX par_ind (parent_id),

FOREIGN KEY (parent_id)

REFERENCES parent(id)

ON DELETE CASCADE

) ENGINE=INNODB;

Com essa estrutura, gravar uma linha em child com um parent_id que não existe em parent gera o erro 1452. O manual também lembra que o MySQL exige índices nas chaves estrangeiras e nas chaves referenciadas, e que na tabela filha o índice é criado sozinho se não existir.

Ver a restrição com SHOW CREATE TABLE

O primeiro passo é saber qual restrição falhou e para onde ela aponta. Para ver a definição da chave estrangeira, o manual indica o SHOW CREATE TABLE, rodado na tabela filha:

SHOW CREATE TABLE child;

Na saída, procure a definição da chave estrangeira (FOREIGN KEY e REFERENCES, como no CREATE TABLE do exemplo acima), que liga a coluna da filha ao pai. Com isso, você sabe onde procurar o valor que falta.

Há ainda um detalhe extra: o InnoDB mostra o último erro de chave estrangeira na seção LATEST FOREIGN KEY ERROR do comando abaixo, que ajuda a ver o que falhou por último:

SHOW ENGINE INNODB STATUS;

Se o comando do seu SQL der erro de sintaxe, confira o guia Erro 1064 MySQL: erro de sintaxe SQL, como resolver. E se o MySQL disser que uma tabela do exemplo não existe, o caso está no guia Erro 1146 MySQL: tabela não existe, como resolver.

Achar as linhas órfãs

Uma linha órfã é uma linha da tabela filha cujo valor de chave estrangeira não tem pai. Se o erro apareceu ao gravar uma linha nova, o valor está na sua instrução. Para procurar linhas que já estão na tabela, use um LEFT JOIN entre a filha e o pai:

SELECT c.*

FROM child c

LEFT JOIN parent p ON p.id = c.parent_id

WHERE c.parent_id IS NOT NULL

AND p.id IS NULL;

A consulta lista as linhas de child que têm parent_id preenchido, mas sem linha correspondente em parent. Se ela não devolver nada, não há órfãs na tabela. Se devolver, cada linha é um valor de pai que falta ou um valor errado na filha.

Corrigir o erro

A orientação do manual de erros é: adicione a linha pai primeiro. Com as tabelas do exemplo, a ordem certa é esta:

INSERT INTO parent (id) VALUES (1);

INSERT INTO child (id, parent_id) VALUES (10, 1);

Há dois caminhos, e a escolha depende do que os seus dados representam:

  • O pai deveria existir: insira a linha na tabela pai e repita a gravação na filha.
  • O valor da filha está errado: corrija o valor para um pai que exista. Por exemplo: UPDATE child SET parent_id = 1 WHERE id = 10;

Ao importar um dump, o manual cita a ordem exigida pelas relações entre as tabelas. O guia Backup MySQL com mysqldump: como fazer e restaurar mostra como fazer e restaurar o backup. Depois de corrigir, repita a gravação e confira se a mensagem sumiu.

Precisa de um banco de dados? O 11SQL Mini sai a partir de R$ 9,90/mês; confira na loja o que cada plano inclui. Ver planos de banco de dados

Erro 1451: o caminho contrário

O erro 1451 parece com o 1452, mas é o inverso. O manual traz o símbolo ER_ROW_IS_REFERENCED_2 e a mensagem Cannot delete or update a parent row: a foreign key constraint fails. Ele acontece quando você tenta apagar ou alterar uma linha pai que ainda tem filhas. A orientação do manual é apagar as filhas primeiro.

  • 1452: filho sem pai, ao inserir ou atualizar a filha.
  • 1451: pai com filhos, ao apagar ou atualizar o pai.

FOREIGN_KEY_CHECKS: o que a documentação diz e o aviso

A verificação das chaves estrangeiras é controlada pela variável foreign_key_checks, que vem ligada por padrão. O manual diz que ela normalmente fica ligada para manter a integridade dos dados. Como usos para desligá-la, a documentação cita dois casos: apagar uma tabela referenciada por chave estrangeira e recarregar tabelas numa ordem diferente da exigida pelas relações, como na importação de um dump fora de ordem. O comando para desligar e religar é este:

SET foreign_key_checks = 0;

-- importação

SET foreign_key_checks = 1;

O aviso do manual: religar a variável não faz varredura dos dados. As linhas incluídas enquanto ela estava desligada não são conferidas quando ela volta.

Este guia não recomenda desligar a variável para resolver o erro 1452: o caminho é corrigir os dados. Se você usou a importação com a variável desligada, rode a consulta de linhas órfãs da seção anterior para conferir o resultado.

ON DELETE e ON UPDATE

A cláusula ON DELETE e a ON UPDATE definem o que acontece com as filhas quando o pai é apagado ou atualizado. Segundo o manual, as opções são:

  • CASCADE: apaga ou atualiza a linha pai e apaga ou atualiza automaticamente as filhas correspondentes.
  • SET NULL: apaga ou atualiza a linha pai e põe NULL na coluna da filha. Essa coluna não pode ser NOT NULL.
  • RESTRICT: recusa apagar ou atualizar a linha pai.
  • NO ACTION: no InnoDB equivale a RESTRICT. Se nada for especificado, o padrão é NO ACTION.
  • SET DEFAULT: o MySQL reconhece, mas o InnoDB e o NDB recusam tabelas com essa cláusula.

No exemplo do manual, a tabela child usa ON DELETE CASCADE: apagar a linha pai apaga as filhas dela. Essas cláusulas tratam do que ocorre ao apagar ou atualizar o pai. A regra do erro 1452 segue valendo ao inserir: o pai precisa existir.

O erro de valor repetido está descrito no guia Erro 1062 MySQL: Duplicate entry, como resolver.

Checklist do erro 1452

  • Leia a mensagem: Cannot add or update a child row indica uma linha filha sem pai.
  • Rode SHOW CREATE TABLE na filha e veja qual coluna aponta para qual pai.
  • Procure o valor do pai na tabela pai.
  • Se o pai deveria existir, insira o pai primeiro e depois a filha.
  • Se o valor da filha está errado, corrija com UPDATE.
  • Procure órfãs com LEFT JOIN e p.id IS NULL.
  • Em importação, carregue as tabelas na ordem exigida pelas relações.
  • Não use foreign_key_checks = 0 para fazer o erro sumir: religar não confere as linhas.

Quer conhecer os planos de VPS da Eleven Host? O Plano Bronze da VPS sai a partir de R$ 17,00/mês; confira na loja o que cada plano inclui. Ver planos de VPS

Perguntas frequentes

O que significa o erro 1452 do MySQL?

Que você tentou inserir ou atualizar uma linha filha cujo valor de chave estrangeira não existe na tabela pai.

Como resolver o erro 1452?

Adicione a linha pai primeiro e depois a filha, ou corrija o valor da filha para um pai que exista.

Como ver a chave estrangeira de uma tabela?

Use SHOW CREATE TABLE na tabela filha e procure a definição com FOREIGN KEY e REFERENCES.

Posso desligar o foreign_key_checks para resolver?

O manual cita usos específicos, como importar um dump fora de ordem, mas avisa que religar a variável não confere as linhas incluídas nesse período. Para o erro 1452, o caminho é corrigir os dados.

Qual a diferença entre o erro 1452 e o 1451?

O 1452 é filho sem pai, ao inserir ou atualizar a filha. O 1451 é pai com filhos, ao apagar ou atualizar o pai.

Esta resposta lhe foi útil?

Artigos Relacionados