ERRO 1452: Não é possível adicionar ou atualizar uma linha filho: uma restrição de chave estrangeira falha

130

Criei tabelas no MySQL Workbench, como mostrado abaixo:

Tabela ORDRE:

CREATE TABLE Ordre (
  OrdreID   INT NOT NULL,
  OrdreDato DATE DEFAULT NULL,
  KundeID   INT  DEFAULT NULL,
  CONSTRAINT Ordre_pk PRIMARY KEY (OrdreID),
  CONSTRAINT Ordre_fk FOREIGN KEY (KundeID) REFERENCES Kunde (KundeID)
)
  ENGINE = InnoDB;

Tabela PRODUKT:

CREATE TABLE Produkt (
  ProduktID          INT NOT NULL,
  ProduktBeskrivelse VARCHAR(100) DEFAULT NULL,
  ProduktFarge       VARCHAR(20)  DEFAULT NULL,
  Enhetpris          INT          DEFAULT NULL,
  CONSTRAINT Produkt_pk PRIMARY KEY (ProduktID)
)
  ENGINE = InnoDB;

e tabela ORDRELINJE:

CREATE TABLE Ordrelinje (
  Ordre         INT NOT NULL,
  Produkt       INT NOT NULL,
  AntallBestilt INT DEFAULT NULL,
  CONSTRAINT Ordrelinje_pk PRIMARY KEY (Ordre, Produkt),
  CONSTRAINT Ordrelinje_fk FOREIGN KEY (Ordre) REFERENCES Ordre (OrdreID),
  CONSTRAINT Ordrelinje_fk1 FOREIGN KEY (Produkt) REFERENCES Produkt (ProduktID)
)
  ENGINE = InnoDB;

Então, quando tento inserir valores na ORDRELINJEtabela, recebo:

Código de erro: 1452. Não é possível adicionar ou atualizar uma linha filho: uma restrição de chave estrangeira falha ( srdjank. Ordrelinje, CONSTRAINT Ordrelinje_fkFOREIGN KEY ( Ordre) REFERENCES Ordre( OrdreID))

Eu já vi os outros posts sobre este tópico, mas sem sorte. Estou supervisionando alguma coisa ou alguma idéia do que fazer?

user3289677
fonte

Respostas:

172

Retirado do uso de restrições FOREIGN KEY

Os relacionamentos de chave estrangeira envolvem uma tabela pai que contém os valores centrais dos dados e uma tabela filha com valores idênticos apontando para o pai. A cláusula FOREIGN KEY é especificada na tabela filho.

Ele rejeitará qualquer operação INSERT ou UPDATE que tente criar um valor de chave estrangeira em uma tabela filha se não houver um valor de chave candidato correspondente na tabela pai.

Portanto, seu erro Error Code: 1452. Cannot add or update a child row: a foreign key constraint failssignifica essencialmente que você está tentando adicionar uma linha à sua Ordrelinjetabela para a qual nenhuma linha correspondente (CódigoDoPedido) está presente na Ordretabela.

Você deve primeiro inserir a linha na sua Ordretabela.

Rahul
fonte
Ou podemos soltar a chave estrangeira e depois adicionar a chave estrangeira após a inserção dos dados?
Vamsi Pavan Mahesh 27/03
@VamsiPavanMahesh, NÃO, causa mesmo se você fizer isso; sua criação de chave estrangeira falhará com o mesmo tipo de erro, pois haverá incompatibilidade de dados principais.
Rahul 27/03
4
Simplesmente falando, se os filhos têm os IDs dos pais definidos, esses pais precisam existir. E eu pensei que minha sintaxe estava errada ... Isso me ajudou muito. Obrigado!
wst
2
E as relações opcionais?
Hamed Hamedi 6/03/19
40

Você está recebendo essa verificação de restrição porque a Ordretabela não possui referência OrdreIDfornecida no comando insert.

Para inserir valor Ordrelinje, primeiro você deve inserir o valor na Ordretabela e usá-lo OrdreIDna Orderlinjetabela.

Ou você pode remover a restrição não nula e inserir um valor NULL nela.

Ankit Bansal
fonte
29

Você deve excluir dados na tabela filha que não possui nenhum valor de chave estrangeira correspondente à chave primária da tabela pai. Ou excluir todos os dados da tabela filha e inserir novos dados com o mesmo valor de chave estrangeira que a chave primária na tabela pai . Isso deve funcionar. Aqui também um vídeo do youtube

Humphrey
fonte
1
Isso está correto. Antes de inserir dados na tabela dinâmica (que possui restrições CASCADE), você deve inserir dados nas tabelas pai. por exemplo, 1ª tabela - permissões; 2ª mesa - funções; 3ª tabela - permission_role; Então, 1º Insira na tabela de permissões, 2º insira na tabela de funções e, finalmente, insira na tabela permission_role.
Deepak Panwar
23

O problema está na restrição de chave estrangeira. Por padrão (SET FOREIGN_KEY_CHECKS = 1). A opção FOREIGN_KEY_CHECKS especifica se as restrições de chave estrangeira devem ou não ser verificadas nas tabelas do InnoDB. MySQL - SET FOREIGN_KEY_CHECKS

Podemos definir a verificação de chave estrangeira como desativada antes de executar a Consulta. Desativar chave estrangeira .

Execute uma dessas linhas antes de executar sua consulta, para poder executá-la com êxito. :)

1) Para sessão (recomendado)

SET FOREIGN_KEY_CHECKS=0;

2) Globalmente

SET GLOBAL FOREIGN_KEY_CHECKS=0;
Mr-Faizan
fonte
19

Esse erro geralmente ocorre porque temos alguns valores no campo de referência da tabela filho, que não existem no campo referenciado / candidato da tabela pai.

Às vezes, podemos receber esse erro quando aplicamos restrições de chave estrangeira às tabelas existentes, já com dados . Algumas das outras respostas estão sugerindo excluir os dados completamente da tabela filho e aplicar a restrição. No entanto, isso não é uma opção quando já temos dados de trabalho / produção na tabela filho. Na maioria dos cenários, precisaremos atualizar os dados na tabela filho (em vez de excluí-los).

Agora, podemos utilizar Left Joinpara encontrar todas essas linhas na tabela filho, que não possuem valores correspondentes na tabela pai. A consulta a seguir seria útil para buscar essas linhas não correspondentes:

SELECT child_table.* 
FROM child_table 
LEFT JOIN parent_table 
  ON parent_table.referenced_column = child_table.referencing_column 
WHERE parent_table.referenced_column IS NULL

Agora, você geralmente pode executar uma (ou mais) das seguintes etapas para corrigir os dados.

  1. Com base na sua "lógica de negócios", você precisará atualizar / combinar esses valores não correspondentes, com os valores existentes na tabela pai. Às vezes, talvez seja necessário configurá-los nulltambém.
  2. Exclua essas linhas com valores incomparáveis.
  3. Adicione novas linhas na tabela pai, correspondendo aos valores sem correspondência na tabela filho.

Depois que os dados são corrigidos, podemos aplicar a restrição de chave estrangeira usando a ALTER TABLEsintaxe.

Madhur Bhaiya
fonte
Eu apagar todos os dados da tabela e, em seguida, adicionar chave estrangeira que tenha sido adicionado obrigado
Sumit Kumar Gupta
4

na tabela de chave estrangeira tem um valor que não pertence à tabela de chave primária que será relacionada, portanto, você deve excluir todos os dados primeiro / ajustar o valor da tabela de chave estrangeira de acordo com o valor da chave primária

Arbahud Rio Daroyni
fonte
3

Eu estava recebendo esse problema, embora minha tabela pai tivesse todos os valores que eu estava referenciando na minha tabela filho. O problema parecia ser que não era possível adicionar várias referências filho a uma única chave estrangeira. Em outras palavras, se eu tivesse cinco linhas de dados referenciadas na mesma chave estrangeira, o MySQL só estava me permitindo carregar a primeira linha e me dando o erro 1452.

O que funcionou para mim foi digitar o código "SET GLOBAL FOREIGN_KEY_CHECKS = 0". Depois disso, fechei o MySQL e, em seguida, reiniciei-o e consegui enviar todos os meus dados sem erros. Digitei "SET GLOBAL FOREIGN_KEY_CHECKS = 1" para restaurar o sistema ao normal, embora não tenha muita certeza do que FOREIGN_KEY_CHECKS faz. Espero que isto ajude!

Matt Mcketty
fonte
Não é exatamente isso que já foi sugerido na resposta postada por @ Mr-Faizan? Caso contrário, explique o que sua resposta adiciona.
Adrian Mole
2

Isso pode ser corrigido inserindo os respectivos registros na tabela pai primeiro e, em seguida, podemos inserir registros na respectiva coluna da tabela filho. Verifique também o tipo e o tamanho dos dados da coluna. Deve ser igual à coluna da tabela pai, até o mecanismo e o agrupamento também devem ser os mesmos. Experimente! Foi assim que resolvi o meu. Corrija-me se estiver errado.

frz
fonte
1

Sua ORDRELINJEtabela está vinculada a ORDERtabela usando uma restrição de chave estrangeira, de constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)acordo com a Ordre int NOT NULL,coluna da tabela que ORDRELINJEdeve corresponder a qualquer Ordre int NOT NULL,coluna da ORDERtabela.

Agora, o que está acontecendo aqui é que, quando você está inserindo uma nova linha na ORDRELINJEtabela, de acordo com a restrição fkOrdrelinje_fk , está verificando a ORDERtabela se ela OrdreIDestá presente ou não e como não está em conformidade com nenhum OrderId, o Compiler está reclamando por violação de chave estrangeira. É por isso que você está recebendo esse erro.

Chave estrangeira é a chave primária da outra tabela que você usa em qualquer tabela para vincular as duas. Essa chave está vinculada à restrição de chave estrangeira especificada ao criar a tabela. Qualquer operação nos dados não deve violar essa restrição. A violação dessa restrição pode resultar em erros como este.

Espero ter deixado claro.

Saket Choubey
fonte
1

Ao inserir os valores do atributo de chave estrangeira, verifique primeiro o tipo de atributo e o valor do atributo de chave primária na relação pai, se os valores na relação pai corresponderem, você poderá inserir / atualizar facilmente os valores do atributo filho.

ashok
fonte
1

você deve adicionar dados da CHAVE DE REFERÊNCIAS na TABELA PRIMÁRIA à CHAVE ESTRANGEIRA na CHILD TABLE
, significa que não adiciona dados aleatórios à chave estrangeira ; basta usar os dados da chave primária que podem ser acessados

descrição dos dados na chave estrangeira

mamal
fonte
1

Isso me ajudou depois de ler as respostas do @-Faizan e outras.

Desmarque a opção "Ativar verificações de chave estrangeira"

no phpMyAdmin e clique na consulta. Não conheço o WorkBench, mas as outras respostas podem ajudá-lo.

Sagar Wankhede
fonte
0

você deve inserir pelo menos um raw em cada tabela (aqueles para os quais as chaves estrangeiras apontam) e inserir ou atualizar os valores das chaves estrangeiras

Harvester Haidar
fonte
0

vou apertar isso aqui: meu caso estava tentando criar um like para um post que não existe; ao confirmar o banco de dados, o erro foi gerado. A solução foi criar primeiro o post e depois gostar. do meu entendimento, se o post_id fosse salvo na tabela de gostos, ele primeiro deveria verificar a tabela de postagens para verificar a existência. achei melhor tê-lo assim, já que é mais lógico para mim desse jeito ..

Pytbyte
fonte
0

Quando você usa chave estrangeira , seu pedido de colunas deve ser o mesmo para inserção .

Por exemplo, se você está adicionando (userid, password)em table1 de table2 seguida, a partir table2 ordem deve ser o mesmo (userid, password)e não como (password,userid) onde useridé chave estrangeira em table2 de table1 .

Kishan Solanki
fonte
0

O problema ocorre porque você define a chave estrangeira na tabela filho depois de inserir alguns dados na tabela filho.

Tente remover todos os dados da tabela filho, defina a chave estrangeira e depois adicione / insira os dados na tabela, pois funcionará.

Khalid Teli
fonte
0

verifique o não. do registro na tabela pai que corresponde à tabela filha e também à chave primária deve corresponder à referência de chave estrangeira. Isso funciona para mim.

Upkar
fonte
-4

Está 100% funcionando ...

ERRO 1452: Não é possível adicionar ou atualizar uma linha filha: uma restrição de chave estrangeira falha .... se esse tipo de erro ocorrer: primeiro, vá para esta tabela e verifique a configuração> se o mecanismo for: InnoDB, mude para MyISAM

(e excluir referências de restrição estrangeira)

kundan chauhan_KP
fonte