Tabelle 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 | | | |
+----------+-------------+------+-----+---------+----------------+
Tabelle 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 | | | |
+------------------+--------------+------+-----+---------+----------------+
Error:
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`))
Was habe ich falsch gemacht? Ich habe http://www.w3schools.com/Sql/sql_foreignkey.asp gelesen und sehe nicht, was los ist.
table2.UserID
nicht vorhanden isttable1.UserID
.Antworten:
Sie erhalten diesen Fehler, weil Sie versuchen, eine Zeile hinzuzufügen / zu aktualisieren
table2
, die keinen gültigen Wert für dasUserID
Feld hat, basierend auf den aktuell gespeicherten Wertentable1
. Wenn Sie weiteren Code veröffentlichen, kann ich Ihnen bei der Diagnose der spezifischen Ursache helfen.quelle
Dies bedeutet, dass Sie versuchen, in
table2
einenUserID
Wert einzufügen, der in nicht vorhanden isttable1
.quelle
Ein einfacher Hack kann darin bestehen, Fremdschlüsselprüfungen zu deaktivieren, bevor eine Operation für die Tabelle ausgeführt wird. Einfach abfragen
Dadurch wird die Fremdschlüsselübereinstimmung mit anderen Tabellen deaktiviert. Nachdem Sie mit der Tabelle fertig sind, aktivieren Sie sie erneut
Das funktioniert bei mir oft.
quelle
Ich habe einen weiteren seltsamen Fall entdeckt: Wenn Sie versehentlich einen Fremdschlüssel aus einer InnoDB-Tabelle in eine MyISAM-Tabelle erstellen, gibt MySQL diesen Fehler zum Zeitpunkt des Einfügens aus, auch wenn die Daten ansonsten gültig sind.
Siehe http://nick.zoic.org/art/mysql-foreign-key-error/
quelle
Sie erhalten diesen Fehler, weil es einen Wert int
table2.UserID
gibt, der nicht vorhanden isttable1.UserID
(ich denke, Sie haben dentable2.UserID
Wert manuell festgelegt, bevor Sie diesen Fremdschlüssel erstellt haben).Ein Beispiel für diese Szene:
table1.UserID
Werte 1,2,3 undtable2.UserID
Werte 4 abrufen (manuell hinzufügen). Also , wenn Sie einen Fremdschlüssel zu machen, können sie nicht findenUserID = 4
austable1
und der Fehler wird ocurse.Um diesen Fehler zu beheben, entfernen Sie einfach
UserID = 4
aus ,table2
oder Sie können beide leer und dann erstellen Sie den Fremdschlüssel und.Viel Glück!
quelle
Ich brauchte eine Weile, um das herauszufinden. Einfach ausgedrückt, die Tabelle, die auf die andere Tabelle verweist, enthält bereits Daten, und einer oder mehrere ihrer Werte sind in der übergeordneten Tabelle nicht vorhanden.
Beispiel: Tabelle 2 enthält die folgenden Daten:
Tabelle 1
Wenn Sie versuchen, Tabelle2 zu ändern und einen Fremdschlüssel hinzuzufügen, schlägt die Abfrage fehl, da Benutzer-ID = 5 in Tabelle1 nicht vorhanden ist.
quelle
Wenn Sie vor dem Erstellen des Fremdschlüssels in Tabelle 2 eine Zeile in Tabelle 1 eingefügt haben, wird ein Fremdschlüsseleinschränkungsfehler angezeigt, da der Wert für die automatische Inkrementierung in Tabelle 1 2 und in Tabelle 2 1 beträgt. Um dies zu lösen, müssen Sie Schneiden Sie Tabelle 1 ab und setzen Sie den Wert für die automatische Inkrementierung wieder auf 1. Anschließend können Sie Tabelle 2 hinzufügen.
quelle
Stellen Sie sicher, dass Sie das Datenbankmodul auf InnoDB eingestellt haben, da in MyISAM Fremdschlüssel und Transaktion nicht unterstützt werden
quelle
Nur eine kleine Korrektur: Machen Sie die JoinColumn 'nullable = true' in Tabelle1 und das 'UserID'-Feld' insertable = false 'und' nullable = true 'in Tabelle2.
In Tabelle 1 Entität:
In Tabelle 2 Entität:
quelle
Ich hatte gerade das gleiche Problem, die Lösung ist einfach.
Sie versuchen, der untergeordneten Tabelle eine ID hinzuzufügen, die in der übergeordneten Tabelle nicht vorhanden ist .
Überprüfen Sie dies gut, da InnoDB den Fehler aufweist, der manchmal die Spalte auto_increment vergrößert, ohne beispielsweise Werte hinzuzufügen.
INSERT ... ON DUPLICATE KEY
quelle
Ich hatte ein ähnliches Problem. Sie versuchen, einen Fremdschlüssel auf eine Tabelle anzuwenden, deren Inhalt und die Spalte nicht nullwertfähig sind. Sie haben zwei Möglichkeiten.
quelle
Stellen Sie sicher, dass der Wert, den Sie in den Fremdschlüssel einfügen, in der übergeordneten Tabelle vorhanden ist. Das hat mir geholfen. Wenn Sie zum Beispiel einfügen
user_id = 2
intable.2
, abertable.1
nicht eine hatuser_id = 2
, dann wird der Zwang einen Fehler aus. Meins war Fehlercode # 1452 um genau zu sein. Hoffe das hilft allen anderen mit dem gleichen Problem!quelle
Ich hatte das gleiche Problem und der Grund war, dass ich vor dem Hinzufügen des Fremdschlüssels eine Zeile in der ersten Tabelle hatte.
quelle
Ich hatte auch das gleiche Problem und das Problem war, dass der Wert meiner übergeordneten Tabelleneinträge nicht mit dem Wert der Fremdschlüsseltabelle übereinstimmt. Also bitte versuchen Sie nach dem Löschen alle Zeilen ..
quelle
Für den Fall, dass die von anderen bereitgestellten Lösungen nicht funktionierten. Dann sollten Sie versuchen, die Datenbank-Engines der übergeordneten und untergeordneten Tabellen zu überprüfen. In meinem Fall wurde die Engine der übergeordneten Tabellen auf "MyISAM" gesetzt und durch Ändern in InnoDB behoben.
Hoffe das hilft anderen, die wie ich festsitzen.
quelle
Sie sollten kein Ondelete-Feld gegen eine Kaskade in der Datenbank einfügen.
Setzen Sie also das Feld onDelete auf RESTRICT
Viel Glück ♥
quelle
Noch ein seltsamer Fall, der mir diesen Fehler gab. Ich hatte meine Fremdschlüssel fälschlicherweise auf den ID-Primärschlüssel verwiesen. Dies wurde durch falsche Befehle zum Ändern der Tabelle verursacht. Ich habe dies herausgefunden, indem ich die Tabelle INFORMATION_SCHEMA abgefragt habe (siehe diese Antwort zum Stapelüberlauf).
Die Tabelle war so verwirrt, dass sie mit keinem ALTER TABLE-Befehl repariert werden konnte. Endlich ließ ich den Tisch fallen und rekonstruierte ihn. Dadurch wurde der Integritätsfehler beseitigt.
quelle
Während Sie die
userID
Spalte hinzugefügt haben , gibt es möglicherweise Daten für diese bestimmte Tabelle, die erstellt wurden, sodass sie den Standardwert von0
haben. Versuchen Sie, die Spalte ohne die hinzuzufügenNOT NULL
quelle
Ich habe auch die folgende Fehlermeldung erhalten: "Eine untergeordnete Zeile kann nicht hinzugefügt oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl." Ich habe den Fehler beim Hinzufügen einer neuen Zeile zur übergeordneten Tabelle erhalten
Das Problem bestand darin, dass die Fremdschlüsseleinschränkung in der übergeordneten Tabelle anstelle der untergeordneten Tabelle definiert wurde.
quelle
Wenn Sie den MySQL-Index oder die Beziehung zwischen Tabellen verwenden, löschen Sie zuerst die Spalten (zum Beispiel: city_id) und erstellen neue Spalten mit demselben Namen (zum Beispiel: city_id). Versuchen Sie es dann erneut ...
quelle
Gibt es vorhandene Daten in der Tabelle? Versuchen Sie in diesem Fall, alle Daten in der Tabelle zu löschen, in der Sie einen Fremdschlüssel hinzufügen möchten. Führen Sie dann den Code erneut aus (fügen Sie einen Fremdschlüssel hinzu).
Ich bin so oft auf dieses Problem gestoßen. Dieses Löschen aller Daten in der Tabelle funktioniert, wenn Sie einer vorhandenen Tabelle einen Fremdschlüssel hinzufügen möchten.
Hoffe das funktioniert :)
quelle
Löschen Sie die Indizes des UserID-Felds von Tabelle2. Es passt zu mir
quelle
Dieses Problem kann aus folgenden Gründen auftreten:
Wenn Sie dies in Spring mvc tun, müssen Sie den ID-Typ explizit beschreiben, da MySQL manchmal den ID-Typ nicht erkennt. Sie setzen also explizit wie in beiden Tabellen in Ihrer Entitätsklasse
@GeneratedValue (strategy = GenerationType.IDENTITY)
quelle