Instrução INSERT em conflito com a restrição FOREIGN KEY - SQL Server

225

Eu estou recebendo o seguinte erro. Podes ajudar-me, por favor?

Mensagem 547, Nível 16, Estado 0, Linha 1
A instrução INSERT entra em conflito com a restrição FOREIGN KEY "FK_Sup_Item_Sup_Item_Cat". O conflito ocorreu no banco de dados "dev_bo", tabela "dbo.Sup_Item_Cat". A instrução foi encerrada.

Código:

insert into sup_item (supplier_id, sup_item_id, name, sup_item_cat_id, 
                      status_code, last_modified_user_id, last_modified_timestamp, client_id)   
values (10162425, 10, 'jaiso', '123123',
        'a', '12', '2010-12-12', '1062425')

A última coluna client_idestá causando o erro. Eu tentei colocar o valor que já existe no dbo.Sup_Item_Catna coluna, correspondente ao sup_item .. mas sem alegria :-(

SmartestVEGA
fonte
20
Você tentou inserir um registro em sua tabela de itens que não possui um registro de categoria correspondente em sua Sup_Item_Cattabela. Não há muito mais a dizer sobre isso.
Martin Smith
1
Então você está dizendo que SELECT * FROM Sup_Item_Cat WHERE sup_item_cat_id = '123123'retorna resultados?
Martin Smith
2
Além disso, você diz "the last coulum" client_id "que estou recebendo o conflito". Não é isso que a mensagem de erro implica. Acho que você está procurando um local errado para o seu problema.
Martin Smith

Respostas:

287

Na sua tabela dbo.Sup_Item_Cat, ele possui uma referência de chave estrangeira para outra tabela. A maneira como um FK funciona é que ele não pode ter um valor nessa coluna que também não esteja na coluna de chave primária da tabela referenciada.

Se você possui o SQL Server Management Studio, abra-o e sp_help' dbo.Sup_Item_Cat'. Veja em qual coluna o FK está e qual coluna de qual tabela ele faz referência. Você está inserindo alguns dados incorretos.

Deixe-me saber se você precisar de algo explicado melhor!

Mike M.
fonte
10
Obrigado por incluir o comando sp_help! Ajudou-me a restringir meu problema semelhante.
Gaʀʀʏ
De fato - no meu caso, a propriedade simplesmente não estava sendo enviada de volta da visualização para o controlador, portanto sempre foi 0 (o que não era um ID válido, mas o controlador não teria como saber disso.)
neminem
1
Alt + F1 é atalho para sp_help, para os leitores futrure, selecione a tabela e pressionar alt + f1
satsvelke
133

Eu mesmo tive esse problema, em relação à mensagem de erro recebida ao tentar preencher um campo de chave estrangeira. Acabei nesta página na esperança de encontrar a resposta. A resposta verificada nesta página é realmente a correta, infelizmente, sinto que a resposta é um pouco incompleta para pessoas que não conhecem o SQL. Eu sou bastante apto a escrever código, mas as consultas SQL são novas para mim, além de criar tabelas de banco de dados.

Apesar da resposta verificada estar correta:

Mike M escreveu:

"A maneira como um FK funciona é que ele não pode ter um valor nessa coluna que também não esteja na coluna de chave primária da tabela referenciada."

O que está faltando nesta resposta é simplesmente;

Você deve criar a tabela que contém a chave primária primeiro.

Outra maneira de dizer isso é;

Você deve inserir dados na tabela pai, contendo a chave primária, antes de tentar inserir dados na tabela filho que contém a chave estrangeira.

Em resumo, muitos dos tutoriais parecem estar escondendo esse fato, de modo que, se você tentar por conta própria e não perceber que há uma ordem de operações, poderá receber esse erro. Naturalmente, após adicionar os dados da chave primária, os dados da chave estrangeira na tabela filho devem estar em conformidade com o campo da chave primária na tabela pai; caso contrário, você ainda receberá esse erro.

Se alguém ler até aqui. Espero que isso tenha ajudado a tornar a resposta marcada mais clara. Sei que alguns de vocês podem achar que esse tipo de coisa é bem direta e que abrir um livro teria respondido a essa pergunta antes de ser publicada, mas a verdade é que nem todo mundo aprende da mesma maneira.

plasmasnakeneo
fonte
E eu acrescentaria, certifique-se de criar um perfil para sua consulta, pois ela nem sempre está enviando o que você acha que deveria ser para o banco de dados.
HLGEM
20

Você está tentando inserir um registro com um valor na coluna de chave estrangeira que não existe na tabela estrangeira.

Por exemplo: Se você possui tabelas Livros e Autores em que Livros possui uma restrição de chave estrangeira na tabela Autores e tenta inserir um registro de livro para o qual não há registro de autor.

Matthew Smith
fonte
16

Você precisará postar sua declaração para obter mais esclarecimentos. Mas...

Esse erro significa que a tabela na qual você está inserindo dados possui um relacionamento de chave estrangeira com outra tabela. Antes que os dados possam ser inseridos, o valor no campo de chave estrangeira deve existir primeiro na outra tabela.

Justin Niessner
fonte
5

O problema não está no client_id, pelo que posso ver. Parece mais que o problema está na quarta coluna, sup_item_cat_id

Eu correria

sp_helpconstraint sup_item

e preste atenção à coluna constraint_keys retornada para a chave estrangeira FK_Sup_Item_Sup_Item_Cat para confirmar qual coluna é o problema real, mas tenho certeza de que não é a que você está tentando corrigir. Além de '123123' parece suspeito também.

Cobusve
fonte
5

Algo que descobri foi que todos os campos precisam corresponder exatamente.

Por exemplo, enviar 'cachorro-gato' não é o mesmo que enviar 'cachorro-gato'.

O que eu fiz para solucionar isso foi criar um script do código FK da tabela em que eu estava inserindo dados, anote a "Chave estrangeira" que apresentava as restrições (no meu caso, eram 2) e verifique se os dois campos correspondem aos valores EXATAMENTE como estavam na tabela que estava lançando o erro FK Constraint.

Depois de consertar os 2 campos dando meus problemas, a vida era boa!

Se você precisar de uma explicação melhor, me avise.

John Waclawski
fonte
Isso realmente me ajudou haha! Negligenciou esse fato, corrigi um problema que eu tinha! Obrigado
Johnathan Brown
4

Também recebi o mesmo erro no meu código SQL. Esta solução funciona para mim,


Verifique os dados na tabela principal. Talvez você esteja inserindo um valor de coluna que não está presente na coluna de chave primária.

Chandan Kumar
fonte
3

Significa exatamente o que diz. Você está tentando inserir um valor em uma coluna que tenha uma restrição FK que não corresponde a nenhum valor na tabela de pesquisa.

Donnie
fonte
2

Verifique novamente os campos no relacionamento para o qual a chave estrangeira está definida. O SQL Server Management Studio pode não ter os campos que você deseja selecionar ao definir o relacionamento. Isso me queimou no passado.

user1424678
fonte
2
  1. execute sp_helpconstraint
  2. pague ATTENTION à coluna constraint_keys retornada para a chave estrangeira
ponto Net
fonte
2

Os dados da tabela pai ausentes causam o problema. No seu problema, a não disponibilidade de dados em "dbo.Sup_Item_Cat" causa o problema

sathish
fonte
1

Eu tive o mesmo problema quando usei migrações de primeiro código para criar meu banco de dados para um aplicativo MVC 5. Acabei encontrando o método de propagação no meu arquivo configuration.cs causando o problema. Meu método de propagação foi criar uma entrada de tabela para a tabela que contém a chave estrangeira antes de criar a entrada com a chave primária correspondente.

Paulie22
fonte
1

Encontrei esse problema quando meus campos de valor de inserção continham guias e espaços que não eram óbvios a olho nu. Eu criei minha lista de valores no Excel, copiei e colei no SQL e executei consultas para encontrar não correspondências nos meus campos FK.

As consultas de correspondência não detectaram que havia tabulações e espaços no meu campo FK, mas o INSERT as reconheceu e continuou gerando o erro.

Testei novamente copiando o conteúdo do campo FK em um registro e colando-o na consulta de inserção. Quando esse registro também falhou, olhei mais de perto os dados e finalmente detecte as guias / espaços.

Depois de limpar as guias / espaços removidos, meu problema foi resolvido. Espero que isso ajude alguém!

mns
fonte