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 ORDRELINJE
tabeli, otrzymuję:
Kod błędu: 1452. Nie można dodać ani zaktualizować wiersza podrzędnego: nie powiodło się ograniczenie klucza obcego (
srdjank
.Ordrelinje
, OGRANICZANIEOrdrelinje_fk
KLUCZA OBCEGO (Ordre
) REFERENCJEOrdre
(OrdreID
))
Widziałem inne posty na ten temat, ale bez powodzenia. Czy coś nadzoruję lub mam jakiś pomysł, co robić?
mysql
sql
mariadb
mysql-error-1452
user3289677
źródło
źródło
Odpowiedzi:
Zaczerpnięte z używania ograniczeń klucza obcego
Więc twój błąd
Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails
zasadniczo oznacza, że próbujesz dodać wiersz doOrdrelinje
tabeli, dla którego nie ma pasującego wiersza (OrderID) wOrdre
tabeli.Najpierw musisz wstawić wiersz do swojej
Ordre
tabeli.źródło
Otrzymujesz to sprawdzenie ograniczenia, ponieważ
Ordre
tabela nie ma odniesieniaOrdreID
podanego w poleceniu wstawiania.Aby wstawić wartość do
Ordrelinje
, musisz najpierw wprowadzić wartość doOrdre
tabeli i użyć tego samegoOrdreID
wOrderlinje
tabeli.Lub możesz usunąć ograniczenie not null i wstawić do niego wartość NULL.
źródło
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
źródło
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)
2) Globalnie
źródło
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 Join
do 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:Teraz możesz ogólnie wykonać jeden (lub więcej) z następujących kroków, aby naprawić dane.
null
.Po ustaleniu danych możemy zastosować ograniczenie klucza obcego za pomocą
ALTER TABLE
składni.źródło
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
źródło
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!
źródło
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ę.
źródło
Twoja
ORDRELINJE
tabela jest połączona zORDER
tabelą za pomocą ograniczenia klucza obcego,constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)
zgodnie z którymOrdre int NOT NULL,
kolumna tabeliORDRELINJE
musi pasować do dowolnejOrdre int NOT NULL,
kolumnyORDER
tabeli.Teraz, gdy wstawiasz nowy wiersz do
ORDRELINJE
tabeli, zgodnie z ograniczeniem fkOrdrelinje_fk
sprawdzaORDER
tabelę, czyOrdreID
jest 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.
źródło
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.
źródło
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
źródło
Pomogło mi to po przeczytaniu @ Mr-Faizan's i innych odpowiedzi.
w phpMyAdmin i kliknij zapytanie. Nie wiem o WorkBench, ale inne odpowiedzi mogą ci pomóc.
źródło
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
źródło
ź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.
źródło
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)
gdzieuserid
jest klucz obcy w tabela2 z tabela1 .źródło
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.
źródło
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.
źródło
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)
źródło