Instrukcja INSERT jest w konflikcie z ograniczeniem FOREIGN KEY - SQL Server

225

Otrzymuję następujący błąd. Czy mógłbyś mi pomóc?

Msg 547, poziom 16, stan 0, wiersz 1
Instrukcja INSERT spowodowała konflikt z ograniczeniem klucza OBCEGO „FK_Sup_Item_Sup_Item_Cat”. Konflikt wystąpił w bazie danych „dev_bo”, tabela „dbo.Sup_Item_Cat”. Instrukcja została zakończona.

Kod:

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')

Ostatnia kolumna client_idpowoduje błąd. Próbowałem umieścić wartość, która już istnieje w dbo.Sup_Item_Catkolumnie, odpowiadającą sup_item .. ale bez radości :-(

SmartestVEGA
źródło
20
Podjęto próbę wstawienia rekordu do tabeli pozycji, który nie ma pasującego rekordu kategorii w Sup_Item_Cattabeli. Niewiele więcej na ten temat.
Martin Smith
1
Więc mówisz, że SELECT * FROM Sup_Item_Cat WHERE sup_item_cat_id = '123123'zwraca wyniki?
Martin Smith
2
Mówisz również „ostatnia nazwa” klient_id „dostaję konflikt”. Nie oznacza to, że komunikat o błędzie sugeruje, że szukasz niewłaściwego miejsca dla swojego problemu.
Martin Smith

Odpowiedzi:

287

W twojej tabeli dbo.Sup_Item_Catznajduje się odwołanie do klucza obcego do innej tabeli. Sposób działania FK polega na tym, że nie może on mieć wartości w tej kolumnie, która również nie znajduje się w kolumnie klucza podstawowego tabeli, do której istnieje odwołanie.

Jeśli masz SQL Server Management Studio, otwórz go i sp_help' dbo.Sup_Item_Cat'. Zobacz, w której kolumnie znajduje się FK i do której kolumny odwołuje się tabela. Wstawiasz złe dane.

Daj mi znać, jeśli potrzebujesz czegoś lepiej wyjaśnionego!

Mike M.
źródło
10
Dziękujemy za włączenie polecenia sp_help! Pomógł mi zawęzić mój podobny problem.
Gaʀʀʏ
Rzeczywiście - w moim przypadku właściwość po prostu nie była odsyłana z widoku do kontrolera, więc zawsze wynosiła 0 (co nie było prawidłowym identyfikatorem, ale kontroler nie miałby możliwości tego wiedzieć).
neminem,
1
Alt + F1 to skrót do sp_help, dla czytelników przyszłości wybierz tabelę i naciśnij alt + f1
satsvelke
133

Sam miałem ten problem dotyczący komunikatu o błędzie, który pojawia się podczas próby wypełnienia pola klucza obcego. Skończyłem na tej stronie w nadziei na znalezienie odpowiedzi. Sprawdzona odpowiedź na tej stronie jest rzeczywiście poprawna, niestety uważam, że odpowiedź jest nieco niekompletna dla osób, które nie znają SQL. Jestem dość zdolny do pisania kodu, ale zapytania SQL są dla mnie nowością, a także budowaniem tabel bazy danych.

Mimo że sprawdzona odpowiedź jest poprawna:

Mike M napisał-

„Sposób, w jaki działa FK, nie może mieć wartości w tej kolumnie, która nie znajduje się również w kolumnie klucza podstawowego w tabeli, do której istnieje odniesienie”.

W tej odpowiedzi brakuje po prostu;

Najpierw musisz zbudować tabelę zawierającą klucz podstawowy.

Innym sposobem, aby to powiedzieć;

Musisz wstawić dane do tabeli nadrzędnej zawierającej klucz podstawowy, zanim spróbujesz wstawić dane do tabeli podrzędnej zawierającej klucz obcy.

Krótko mówiąc, wiele samouczków wydaje się zastanawiać nad tym faktem, więc jeśli spróbujesz samodzielnie i nie zdasz sobie sprawy, że istnieje kolejność operacji, otrzymasz błąd. Oczywiście po dodaniu danych klucza podstawowego dane klucza obcego w tabeli podrzędnej muszą być zgodne z polem klucza podstawowego w tabeli nadrzędnej, w przeciwnym razie nadal będzie występować ten błąd.

Jeśli ktoś poczyta tak daleko. Mam nadzieję, że pomogło to wyjaśnić sprawdzoną odpowiedź. Wiem, że niektórzy z was mogą uważać, że tego rodzaju rzeczy są dość proste i że otwarcie książki odpowiedziałoby na to pytanie przed opublikowaniem, ale prawda jest taka, że ​​nie każdy uczy się w ten sam sposób.

plasmasnakeneo
źródło
I chciałbym dodać, pamiętaj o sprofilowaniu zapytania, ponieważ nie zawsze wysyła to, co Twoim zdaniem powinno być do bazy danych.
HLGEM
20

Próbujesz wstawić rekord z wartością w kolumnie klucza obcego, która nie istnieje w tabeli obcej.

Na przykład: jeśli masz tabele Książki i autorzy, w których książki są ograniczone kluczem obcym w tabeli Autorzy i próbujesz wstawić rekord książki, dla którego nie ma rekordu autora.

Matthew Smith
źródło
16

Będziesz musiał opublikować swoje oświadczenie w celu uzyskania dodatkowych wyjaśnień. Ale...

Ten błąd oznacza, że ​​tabela, do której wstawiasz dane, ma relację klucza obcego z inną tabelą. Przed wstawieniem danych wartość w polu klucza obcego musi najpierw istnieć w drugiej tabeli.

Justin Niessner
źródło
5

Problemem nie jest klient_id z tego, co widzę. Wygląda bardziej na problem z czwartą kolumną, sup_item_cat_id

biegałbym

sp_helpconstraint sup_item

i zwróć uwagę na kolumnę constraint_keys zwróconą dla klucza obcego FK_Sup_Item_Sup_Item_Cat, aby potwierdzić, która kolumna jest rzeczywistym problemem, ale jestem prawie pewna, że ​​nie jest to ta, którą próbujesz naprawić. Poza tym „123123” również wygląda podejrzanie.

Cobusve
źródło
5

Odkryłem, że wszystkie pola muszą DOKŁADNIE pasować.

Na przykład wysłanie „kota-psa” nie jest tym samym, co wysłanie „kota-psa”.

Aby rozwiązać ten problem, wypisałem kod FK z tabeli, do której wstawiałem dane, zwróciłem uwagę na „klucz obcy”, który miał ograniczenia (w moim przypadku były 2) i upewniłem się, że te 2 pola pasują do siebie DOKŁADNIE tak, jak w tabeli zgłaszającej błąd Ograniczenia FK.

Gdy naprawiłem 2 pola dające moje problemy, życie było dobre!

Jeśli potrzebujesz lepszego wyjaśnienia, daj mi znać.

Jan Wacławski
źródło
To naprawdę pomogło mi haha! Przeoczyłem ten fakt, naprawiłem problem, który miałem! Dziękuję
Johnathan Brown
4

Mam również ten sam błąd w kodzie SQL. To rozwiązanie działa dla mnie,


Sprawdź dane w tabeli podstawowej Być może wprowadzasz wartość kolumny, która nie jest obecna w kolumnie klucza podstawowego.

Chandan Kumar
źródło
3

Oznacza dokładnie to, co mówi. Próbujesz wstawić wartość do kolumny z ograniczeniem FK, która nie pasuje do żadnych wartości w tabeli odnośników.

Donnie
źródło
2

Sprawdź dwukrotnie pola w relacji, dla której zdefiniowano klucz obcy. Program SQL Server Management Studio mógł nie mieć wybranych pól podczas definiowania relacji. To mnie paliło w przeszłości.

użytkownik1424678
źródło
2
  1. uruchom sp_helpconstraint
  2. zwróć uwagę na kolumnę constraint_keys zwróconą dla klucza obcego
dotnet
źródło
2

Brak danych tabeli nadrzędnej powoduje problem. W twoim problemie brak dostępności danych w „dbo.Sup_Item_Cat” powoduje problem

satycki
źródło
1

Miałem ten sam problem, kiedy użyłem migracji kodu do zbudowania bazy danych dla aplikacji MVC 5. W końcu znalazłem metodę inicjującą w moim pliku configuration.cs, która jest przyczyną problemu. Moją metodą początkową było utworzenie pozycji tabeli dla tabeli zawierającej klucz obcy przed utworzeniem pozycji z pasującym kluczem podstawowym.

Paulie22
źródło
1

Natrafiłem na ten problem, gdy moje pola wartości wstawiania zawierały tabulatory i spacje, które nie były oczywiste gołym okiem. Utworzyłem moją listę wartości w Excelu, skopiowałem i wkleiłem ją do SQL i uruchamiam zapytania, aby znaleźć niepasujące do moich pól FK.

Zapytania o dopasowanie nie wykryły tabulacji i spacji w moim polu FK, ale INSERT je rozpoznał i nadal generował błąd.

Testowałem ponownie, kopiując zawartość pola FK w jednym rekordzie i wklejając ją do zapytania wstawiania. Kiedy ten rekord również nie powiódł się, przyjrzałem się bliżej danym i w końcu wykryłem tabulatory / spacje.

Po wyczyszczeniu usuniętych kart / spacji mój problem został rozwiązany. Mam nadzieję, że to komuś pomoże!

mns
źródło