Tabela 1
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| UserID | int(11) | NO | PRI | NULL | auto_increment |
| Password | varchar(20) | NO | | | |
| Username | varchar(25) | NO | | | |
| Email | varchar(60) | NO | | | |
+----------+-------------+------+-----+---------+----------------+
Tabela 2
+------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+----------------+
| UserID | int(11) | NO | MUL | | |
| PostID | int(11) | NO | PRI | NULL | auto_increment |
| Title | varchar(50) | NO | | | |
| Summary | varchar(500) | NO | | | |
+------------------+--------------+------+-----+---------+----------------+
Błąd:
com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException:
Cannot add or update a child row: a foreign key constraint fails
(`myapp/table2`, CONSTRAINT `table2_ibfk_1` FOREIGN KEY (`UserID`)
REFERENCES `table1` (`UserID`))
Co zrobiłem źle? Czytam http://www.w3schools.com/Sql/sql_foreignkey.asp i nie widzę, co jest nie tak.
table2.UserID
, która nie istnieje wtable1.UserID
.Odpowiedzi:
Otrzymujesz ten błąd, ponieważ próbujesz dodać / zaktualizować wiersz
table2
, który nie ma prawidłowej wartości dlaUserID
pola na podstawie wartości aktualnie przechowywanych wtable1
. Jeśli prześlesz więcej kodu, pomogę Ci zdiagnozować konkretną przyczynę.źródło
Oznacza to, że próbujesz wstawić
table2
doUserID
wartości, która nie istnieje wtable1
.źródło
Prostym hackem może być wyłączenie sprawdzania klucza obcego przed wykonaniem jakiejkolwiek operacji na tabeli. Wystarczy zapytać
Spowoduje to wyłączenie dopasowywania kluczy obcych do innych tabel. Po zakończeniu pracy ze stołem włącz ją ponownie
To działa dla mnie wiele razy.
źródło
Odkryłem inny dziwny przypadek: jeśli przypadkowo utworzysz klucz obcy z tabeli InnoDB do tabeli MyISAM, MySQL zgłasza ten błąd podczas wstawiania, nawet jeśli dane są prawidłowe.
Zobacz http://nick.zoic.org/art/mysql-foreign-key-error/
źródło
Otrzymujesz ten błąd, ponieważ istnieje pewna wartość int,
table2.UserID
która nie istniejetable1.UserID
( wydaje mi się, że ustawiłeśtable2.UserID
wartość ręcznie przed utworzeniem tego klucza obcego).Jeden przykład dla tej sceny:
table1.UserID
pobierz wartości 1,2,3 itable2.UserID
uzyskaj wartości 4 (dodaj ręcznie). Więc kiedy tworzysz klucz obcy, nie mogą znaleźćUserID = 4
ztable1
i wystąpi błąd.Aby naprawić ten błąd, po prostu usuń
UserID = 4
ztable2
lub możesz opróżnić oba z nich, a następnie utwórz klucz obcy i.Powodzenia!
źródło
Zajęło mi to trochę czasu, zanim zrozumiałem. Mówiąc najprościej, tabela, która odwołuje się do drugiej tabeli, zawiera już dane, a co najmniej jedna z jej wartości nie istnieje w tabeli nadrzędnej.
np. Tabela 2 zawiera następujące dane:
Tabela 1
Jeśli spróbujesz ZMIENIĆ tabelę2 i dodać klucz obcy, zapytanie nie powiedzie się, ponieważ identyfikator UserID = 5 nie istnieje w tabeli1.
źródło
Jeśli wstawiłeś wiersz do tabeli 1 przed utworzeniem klucza obcego w tabeli 2, otrzymasz błąd ograniczenia klucza obcego, ponieważ wartość automatycznego przyrostu wynosi 2 w tabeli 1 i 1 w tabeli 2. Aby rozwiązać ten problem, musisz obetnij tabelę 1 i ustaw wartość automatycznego zwiększania z powrotem na 1. Następnie możesz dodać tabelę 2.
źródło
Upewnij się, że ustawiłeś silnik bazy danych na InnoDB, ponieważ w MyISAM klucz obcy i transakcje nie są obsługiwane
źródło
Tylko mała poprawka: ustaw wartość JoinColumn jako „nullable = true” w tabeli 1 i pole „UserID” „insertable = false” i „nullable = true” w tabeli 2.
W jednostce tabeli 1:
W jednostce tabeli 2:
źródło
Miałem ten sam problem, rozwiązanie jest łatwe.
Próbujesz dodać identyfikator w tabeli podrzędnej, który nie istnieje w tabeli nadrzędnej.
sprawdź dobrze, ponieważ InnoDB ma błąd, który czasami zwiększa kolumnę auto_increment bez dodawania wartości, na przykład
INSERT ... ON DUPLICATE KEY
źródło
Miałem podobny problem. Próbujesz zastosować klucz obcy do tabeli, która ma zawartość, a kolumna nie dopuszcza wartości null. Masz dwie możliwości.
źródło
Upewnij się, że wartość wstawiana do klucza obcego istnieje w tabeli nadrzędnej. To mi pomogło. Na przykład, jeśli wstawisz
user_id = 2
dotable.2
, aletable.1
nie masz auser_id = 2
, wówczas ograniczenie zwróci błąd. Dokładnie mówiąc, mój kod błędu to 1452. Mam nadzieję, że pomoże to komukolwiek innemu z tym samym problemem!źródło
Miałem ten sam problem, a powodem było to, że przed dodaniem klucza obcego miałem wiersz w pierwszej tabeli.
źródło
Napotkałem również ten sam problem, a problem polegał na tym, że wartość moich wpisów w tabeli nadrzędnej nie była zgodna z wartością tabeli klucza obcego. Więc spróbuj po wyczyszczeniu wszystkich wierszy.
źródło
W przypadku, gdy rozwiązania dostarczone przez innych nie zadziałały. Następnie powinieneś spróbować sprawdzić silniki bazy danych tabel nadrzędnych i podrzędnych. W moim przypadku silnik tabel nadrzędnych był ustawiony na „MyISAM”, zmieniając go na InnoDB, naprawił to.
Mam nadzieję, że pomoże to innym, którzy utknęli tak jak ja.
źródło
Nie należy umieszczać pola ondelete przeciwko kaskadzie w bazie danych.
Ustaw więc pole onDelete na RESTRICT
Powodzenia ♥
źródło
Kolejny dziwny przypadek, który spowodował ten błąd. Błędnie odniosłem moje klucze obce do klucza podstawowego id. Było to spowodowane niepoprawnymi poleceniami alter table. Dowiedziałem się tego, przeszukując tabelę INFORMATION_SCHEMA (zobacz tę odpowiedź stackoverflow)
Tabela była tak zagmatwana, że nie można jej było naprawić żadnymi poleceniami ALTER TABLE . W końcu upuściłem stół i zrekonstruowałem go. Pozbyło się błędu integrityError.
źródło
Może podczas dodawania
userID
kolumny istnieją dane dla tej określonej tabeli, która została utworzona, więc będzie miała domyślną wartość0
, spróbuj dodać kolumnę bezNOT NULL
źródło
Pojawił się również ten błąd: „Nie można dodać lub zaktualizować wiersza podrzędnego: nie udało się ograniczyć klucza obcego”. Wystąpił błąd podczas dodawania nowego wiersza do tabeli nadrzędnej
Problem polegał na tym, że ograniczenie klucza obcego zostało zdefiniowane w tabeli nadrzędnej zamiast tabeli podrzędnej.
źródło
Jeśli używasz indeksu mysql lub relacji między tabelami, najpierw usuń kolumny (na przykład: city_id) i utwórz nowe kolumny o tej samej nazwie (na przykład: city_id), a następnie spróbuj ponownie ...
źródło
Czy istnieją jakieś dane, które zawiera tabela? Jeśli tak, spróbuj wyczyścić wszystkie dane z tabeli, do której chcesz dodać klucz obcy. Następnie ponownie uruchom kod (dodaj klucz obcy).
Tyle razy napotkałem ten problem. To wyczyszczenie wszystkich danych w tabeli działa, gdy chcesz dodać klucz obcy do istniejącej tabeli.
Mam nadzieję, że to zadziała :)
źródło
Usuń indeksy pola ID użytkownika w tabeli 2. Dla mnie pasuje
źródło
Ten błąd występuje, gdy chcesz dodać klucz obcy z wartościami, które nie istnieją w kluczu podstawowym tabeli nadrzędnej. Należy się upewnić, że nowy identyfikator użytkownika klucza obcego w tabeli 2 ma wartości, które istnieją w kluczu podstawowym tabela1, czasami domyślnie jest to null lub równe 0.
Możesz najpierw zaktualizować wszystkie pola klucza obcego w tabeli 2 o wartość istniejącą w kluczu podstawowym tabeli 1.
Jeśli chcesz dodać różne identyfikatory użytkowników, musisz zmodyfikować każdy wiersz z żądanymi wartościami.
źródło
Ten problem może wystąpić z następującego powodu:
Jeśli robisz to w Spring mvc, musisz wyraźnie opisać typ identyfikatora, ponieważ czasami mysql nie rozpoznaje typu identyfikatora. więc jawnie ustawiasz tak, jak w obu tabelach w klasie jednostki
@GeneratedValue (strategy = GenerationType.IDENTITY)
źródło