BŁĄD 1452: Nie można dodać lub zaktualizować wiersza podrzędnego: ograniczenie klucza obcego nie powiodło się

132

Utworzyłem tabele w MySQL Workbench, jak pokazano poniżej:

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;

Stół 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;

i stół 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;

więc kiedy próbuję wstawić wartości do ORDRELINJEtabeli, otrzymuję:

Kod błędu: 1452. Nie można dodać ani zaktualizować wiersza podrzędnego: nie powiodło się ograniczenie klucza obcego ( srdjank. Ordrelinje, OGRANICZANIE Ordrelinje_fkKLUCZA OBCEGO ( Ordre) REFERENCJE Ordre( OrdreID))

Widziałem inne posty na ten temat, ale bez powodzenia. Czy coś nadzoruję lub mam jakiś pomysł, co robić?

user3289677
źródło

Odpowiedzi:

173

Zaczerpnięte z używania ograniczeń klucza obcego

Relacje klucza obcego obejmują tabelę nadrzędną, która przechowuje centralne wartości danych, oraz tabelę podrzędną z identycznymi wartościami wskazującymi z powrotem na jej element nadrzędny. Klauzula FOREIGN KEY jest określona w tabeli podrzędnej.

Odrzuci każdą operację INSERT lub UPDATE, która próbuje utworzyć wartość klucza obcego w tabeli podrzędnej, jeśli w tabeli nadrzędnej nie ma pasującej wartości klucza kandydującego.

Więc twój błąd Error Code: 1452. Cannot add or update a child row: a foreign key constraint failszasadniczo oznacza, że ​​próbujesz dodać wiersz do Ordrelinjetabeli, dla którego nie ma pasującego wiersza (OrderID) w Ordretabeli.

Najpierw musisz wstawić wiersz do swojej Ordretabeli.

Rahul
źródło
Czy możemy porzucić klucz obcy, a następnie dodać klucz obcy po wstawieniu danych?
Vamsi Pavan Mahesh
@VamsiPavanMahesh, NO, bo nawet jeśli to zrobisz; tworzenie klucza foriegn zakończy się niepowodzeniem z tego samego rodzaju błędem, ponieważ wystąpi niezgodność danych klucza.
Rahul
4
Mówiąc prościej, jeśli dzieci mają zdefiniowane identyfikatory rodziców, ci rodzice muszą istnieć. Myślałem, że moja składnia jest zła ... Bardzo mi to pomogło. Dzięki!
wst
2
A co z relacjami opcjonalnymi?
Hamed Hamedi
40

Otrzymujesz to sprawdzenie ograniczenia, ponieważ Ordretabela nie ma odniesienia OrdreIDpodanego w poleceniu wstawiania.

Aby wstawić wartość do Ordrelinje, musisz najpierw wprowadzić wartość do Ordretabeli i użyć tego samego OrdreIDw Orderlinjetabeli.

Lub możesz usunąć ograniczenie not null i wstawić do niego wartość NULL.

Ankit Bansal
źródło
30

Należy usunąć dane z tabeli podrzędnej, które nie mają żadnej wartości klucza obcego odpowiadającej kluczowi głównemu tabeli nadrzędnej lub usunąć wszystkie dane z tabeli podrzędnej, a następnie wstawić nowe dane o tej samej wartości klucza obcego co klucz podstawowy w tabeli nadrzędnej . To powinno działać . Tutaj także wideo z YouTube

Humphrey
źródło
1
To jest poprawne, przed wstawieniem danych do tabeli przestawnej (która ma ograniczenia CASCADE), musisz wstawić dane do tabel nadrzędnych. np. 1. tabela - uprawnienia; 2. stół - role; Trzecia tabela - Permissions_role; Więc 1. wstaw do tabeli uprawnień, 2. wstaw do tabeli ról i na koniec wstaw do tabeli Permissions_role.
Deepak Panwar
25

Problem dotyczy ograniczenia klucza obcego. Domyślnie (SET FOREIGN_KEY_CHECKS = 1). Opcja FOREIGN_KEY_CHECKS określa, czy sprawdzać ograniczenia klucza obcego dla tabel InnoDB. MySQL - USTAW FOREIGN_KEY_CHECKS

Przed uruchomieniem zapytania możemy ustawić sprawdzanie klucza obcego jako wyłączone. Wyłącz klucz obcy .

Wykonaj jedną z tych linii przed uruchomieniem zapytania, a następnie możesz pomyślnie uruchomić zapytanie. :)

1) Do sesji (zalecane)

SET FOREIGN_KEY_CHECKS=0;

2) Globalnie

SET GLOBAL FOREIGN_KEY_CHECKS=0;
Mr-Faizan
źródło
19

Ten błąd zwykle występuje, ponieważ mamy pewne wartości w polu odwołującym się tabeli podrzędnej, które nie istnieją w polu odniesienia / kandydującym tabeli nadrzędnej.

Czasami możemy otrzymać ten błąd, gdy stosujemy ograniczenia klucza obcego do istniejących tabel, mając już w nich dane . Niektóre inne odpowiedzi sugerują całkowite usunięcie danych z tabeli podrzędnej, a następnie zastosowanie ograniczenia. Nie jest to jednak opcja, gdy mamy już dane robocze / produkcyjne w tabeli podrzędnej. W większości scenariuszy będziemy musieli zaktualizować dane w tabeli podrzędnej (zamiast je usuwać).

Teraz możemy użyć Left Joindo znalezienia wszystkich tych wierszy w tabeli podrzędnej, która nie ma pasujących wartości w tabeli nadrzędnej. Poniższe zapytanie byłoby pomocne w pobraniu tych niezgodnych wierszy:

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

Teraz możesz ogólnie wykonać jeden (lub więcej) z następujących kroków, aby naprawić dane.

  1. W oparciu o swoją „logikę biznesową” będziesz musiał zaktualizować / dopasować te niedopasowane wartości z istniejącymi wartościami w tabeli nadrzędnej. Czasami może być konieczne ich ustawienie null.
  2. Usuń te wiersze z niezgodnymi wartościami.
  3. Dodaj nowe wiersze w tabeli nadrzędnej, odpowiadające niezgodnym wartościom w tabeli podrzędnej.

Po ustaleniu danych możemy zastosować ograniczenie klucza obcego za pomocą ALTER TABLEskładni.

Madhur Bhaiya
źródło
Usuwam wszystkie dane z tabeli, a następnie dodaję klucz obcy, który został dodany dziękuję
Sumit Kumar Gupta
4

w tabeli kluczy obcych ma wartość, która nie jest własnością w tabeli kluczy podstawowych, która będzie powiązana, więc musisz najpierw usunąć wszystkie dane / dostosować wartość tabeli kluczy obcych zgodnie z wartością znajdującą się w kluczu podstawowym

Arbahud Rio Daroyni
źródło
3

Pojawiał się ten problem, mimo że moja tabela nadrzędna zawierała wszystkie wartości, do których odwoływałem się w tabeli podrzędnej. Wydawało się, że problem polegał na tym, że nie mogłem dodać wielu odwołań podrzędnych do jednego klucza obcego. Innymi słowy, gdybym miał pięć wierszy danych odwołujących się do tego samego klucza obcego, MySQL pozwalał mi tylko na przesłanie pierwszego wiersza i wyświetlał błąd 1452.

U mnie zadziałało wpisanie kodu „SET GLOBAL FOREIGN_KEY_CHECKS = 0”. Następnie zamknąłem MySQL, a następnie uruchomiłem go ponownie i mogłem przesłać wszystkie moje dane bez błędów. Następnie wpisałem „SET GLOBAL FOREIGN_KEY_CHECKS = 1”, aby przywrócić system do normalnego stanu, chociaż nie jestem do końca pewien, co robi FOREIGN_KEY_CHECKS. Mam nadzieję że to pomoże!

Matt Mcketty
źródło
Czy to nie jest właśnie to, co zostało już zasugerowane w odpowiedzi opublikowanej przez @ Mr-Faizan? Jeśli nie, wyjaśnij, co dodaje Twoja odpowiedź.
Adrian Mole
2

Można to naprawić, wstawiając najpierw odpowiednie rekordy do tabeli nadrzędnej, a następnie możemy wstawić rekordy do odpowiedniej kolumny tabeli podrzędnej. Sprawdź także typ danych i rozmiar kolumny. Powinien być taki sam, jak kolumna tabeli nadrzędnej, nawet silnik i sortowanie powinny być takie same. SPRÓBUJ TEGO! Oto jak rozwiązałem swoje. Popraw mnie, jeśli się mylę.

frz
źródło
1

Twoja ORDRELINJEtabela jest połączona z ORDERtabelą za pomocą ograniczenia klucza obcego, constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)zgodnie z którym Ordre int NOT NULL,kolumna tabeli ORDRELINJEmusi pasować do dowolnej Ordre int NOT NULL,kolumny ORDERtabeli.

Teraz, gdy wstawiasz nowy wiersz do ORDRELINJEtabeli, zgodnie z ograniczeniem fk Ordrelinje_fksprawdza ORDERtabelę, czy OrdreIDjest obecny, czy nie, i ponieważ nie pasuje do żadnego OrderId, kompilator skarży się na naruszenie klucza obcego. To jest powód, dla którego otrzymujesz ten błąd.

Klucz obcy to klucz podstawowy drugiej tabeli, którego używasz w dowolnej tabeli do łączenia obu. Ten klucz jest powiązany z ograniczeniem klucza obcego, które określasz podczas tworzenia tabeli. Żadna operacja na danych nie może naruszać tego ograniczenia. Naruszenie tego ograniczenia może skutkować takimi błędami.

Mam nadzieję, że wyjaśniłem to.

Saket Choubey
źródło
1

Podczas wstawiania wartości atrybutów klucza obcego, najpierw sprawdź typ atrybutów, a także wartość atrybutu klucza podstawowego w relacji nadrzędnej, jeśli wartości w relacji nadrzędnej są zgodne, możesz łatwo wstawiać / aktualizować wartości atrybutów podrzędnych.

ashok
źródło
1

należy dodać dane z KLUCZA REFERENCYJNEGO w TABELI PODSTAWOWEJ do KLUCZA OBCEGO w TABELI DZIECIĘCEJ
oznacza to, że nie należy dodawać danych losowych do klucza obcego ، wystarczy użyć danych z klucza podstawowego, który jest dostępny

opis danych w kluczu obcym

mamal
źródło
1

Pomogło mi to po przeczytaniu @ Mr-Faizan's i innych odpowiedzi.

Odznacz opcję „Włącz sprawdzanie kluczy obcych”

w phpMyAdmin i kliknij zapytanie. Nie wiem o WorkBench, ale inne odpowiedzi mogą ci pomóc.

Sagar Wankhede
źródło
0

powinieneś wstawić co najmniej jeden raw w każdej tabeli (te, na które mają wskazywać klucze obce) wtedy możesz wstawić lub zaktualizować wartości kluczy obcych

Harvester Haidar
źródło
0

źle to w tym miejscu: moja sprawa próbowała stworzyć polubienie postu, który nie istnieje; podczas zatwierdzania do bazy danych wystąpił błąd. rozwiązaniem było najpierw stworzyć post, a potem go polubić. z mojego zrozumienia, jeśli post_id miał zostać zapisany w tabeli polubień, musiał najpierw sprawdzić w tabeli postów, aby ustalić istnienie. Uważam, że lepiej jest mieć to w ten sposób, ponieważ jest to dla mnie bardziej logiczne.

Pytbyte
źródło
0

Gdy używasz klucza obcego , kolejność kolumn powinna być taka sama podczas wstawiania .

Na przykład, jeśli dodajesz (userid, password)w Tabela1 z tabela2 następnie z Table2 kolejności powinien być taki sam (userid, password), a nie jak (password,userid) gdzie useridjest klucz obcy w tabela2 z tabela1 .

Kishan Solanki
źródło
0

Ten problem występuje, ponieważ klucz obcy został ustawiony w tabeli podrzędnej po wstawieniu niektórych danych do tabeli podrzędnej.

Spróbuj usunąć wszystkie dane z tabeli podrzędnej, a następnie ustaw klucz obcy, a następnie dodaj / wstaw dane w tabeli, zadziała.

Khalid Teli
źródło
0

sprawdź nr. rekordu w tabeli nadrzędnej, który pasuje do tabeli podrzędnej, a także klucz podstawowy musi być zgodny z odwołaniem do klucza obcego. To działa dla mnie.

Upkar
źródło
-4

Działa w 100% ...

BŁĄD 1452: Nie można dodać ani zaktualizować wiersza podrzędnego: ograniczenie klucza obcego nie powiodło się .... jeśli wystąpi ten typ błędu: następnie najpierw przejdź do tej tabeli i sprawdź ustawienia> jeśli silnik to: InnoDB, zmień go na MyISAM

(i usuń odniesienia do obcego ograniczenia)

kundan chauhan_KP
źródło