Erro 1452 MySQL: foreign key constraint, como resolver
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

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_idde 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õeNULLna coluna da filha. Essa coluna não pode serNOT NULL.RESTRICT: recusa apagar ou atualizar a linha pai.NO ACTION: no InnoDB equivale aRESTRICT. 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 rowindica uma linha filha sem pai. - Rode
SHOW CREATE TABLEna 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 JOINep.id IS NULL. - Em importação, carregue as tabelas na ordem exigida pelas relações.
- Não use
foreign_key_checks = 0para 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.