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 las http://www.w3schools.com/Sql/sql_foreignkey.asp und sehe nicht, was falsch ist.
Diese Fehlermeldung wird angezeigt, weil Sie versuchen, eine Zeile zu table2
hinzuzufügen/zu aktualisieren, die keinen gültigen Wert für das UserID
-Feld hat, basierend auf den aktuell in table1
gespeicherten Werten. Wenn Sie mehr Code posten, kann ich Ihnen helfen, die Ursache zu ermitteln.
Es bedeutet, dass Sie versuchen, einen UserID
-Wert in table2
einzufügen, der in table1
nicht vorhanden ist.
Ein einfacher Hack kann das Deaktivieren von Fremdschlüsselprüfungen sein, bevor eine Operation an der Tabelle ausgeführt wird. Fragen Sie einfach ab
SET FOREIGN_KEY_CHECKS=0
Dadurch wird der Fremdschlüsselabgleich mit allen anderen Tabellen deaktiviert. Nachdem Sie mit der Tabelle fertig sind, aktivieren Sie sie erneut
SET FOREIGN_KEY_CHECKS=1
Das funktioniert oft für mich.
Ich entdeckte einen anderen seltsamen Fall: 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, selbst wenn die Daten ansonsten gültig sind.
Sie erhalten diese Fehlermeldung, weil es einen bestimmten Wert table2.UserID
gibt, der auf table1.UserID
nicht vorhanden ist (ich denke, Sie haben table2.UserID
manuell vor dem Erstellen dieses Fremdschlüssels festgelegt) ..
Ein Beispiel für diese Szene: table1.UserID
rufe die Werte 1,2,3 und table2.UserID
die Werte 4 (add by manual). Wenn Sie also einen Fremdschlüssel erstellen, können sie UserID = 4
nicht aus table1
finden, und der Fehler wird verdeckt .
Um diesen Fehler zu beheben, entfernen Sie einfach UserID = 4
aus table2
oder Sie können beide leeren und dann den Fremdschlüssel und ..__ erstellen.
Viel Glück!
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 Auto-Inkrement-Wert in Tabelle 1 1 und in Tabelle 2 1 ist kürzen Sie Tabelle 1 und setzen Sie den Auto-Inkrement-Wert wieder auf 1. Anschließend können Sie Tabelle 2 hinzufügen.
Ich hatte gerade das gleiche Problem, die Lösung ist einfach.
Sie versuchen, eine ID in der untergeordneten Tabelle hinzuzufügen, die nicht existiert in der übergeordneten Tabelle.
prüfen Sie dies gut, denn InnoDB hat den Fehler, der manchmal die Spalte auto_increment erhöht, ohne dass Werte hinzugefügt werden, z. B. INSERT ... ON DUPLICATE KEY
.
Ich hatte ein ähnliches Problem. Sie versuchen, einen Fremdschlüssel auf eine Tabelle anzuwenden, die Inhalt enthält und die Spalte nicht nullfähig ist. Sie haben zwei Möglichkeiten.
Stellen Sie sicher, dass Sie das Datenbankmodul auf InnoDB eingestellt haben, da Fremdschlüssel und Transaktionen in MyISAM nicht unterstützt werden
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 beispielsweise user_id = 2
in table.2
einfügen, aber table.1
keinen user_id = 2
hat, gibt die Einschränkung einen Fehler aus. Meiner war der Fehlercode # 1452, um genau zu sein. Hoffe, das hilft jedem anderen mit dem gleichen Problem!
Ich hatte das gleiche Problem und der Grund war, dass ich in der ersten Tabelle eine Zeile hatte, bevor ich den Fremdschlüssel hinzufügte.
Ich brauchte eine Weile, um es herauszufinden. Einfach ausgedrückt enthält die Tabelle, die auf die andere Tabelle verweist, bereits Daten, und einer oder mehrere ihrer Werte sind in der übergeordneten Tabelle nicht vorhanden.
z.B. Tabelle2 enthält die folgenden Daten:
UserID PostID Title Summary
5 1 Lorem Ipsum dolor sit
Tabelle 1
UserID Password Username Email
9 ******** JohnDoe [email protected]
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.
Nur ein bisschen fix: Setze die JoinColumn in Table1 auf 'nullable = true' und im Feld 'UserID' auf 'insertable = false' und 'nullable = true' in Table2.
In Tabelle1-Entität:
@OneToMany(targetEntity=Table2.class, cascade = CascadeType.ALL)
@JoinColumn(name = "UserID", referencedColumnName = "UserID", nullable = true)
private List<Table2> table2List;
In Table2 Entity:
@Column(insertable = false, nullable = true)
private int UserID;
Ein weiterer komischer Fall, der mir diesen Fehler gegeben hat. Ich hatte meine Fremdschlüssel fälschlicherweise auf den ID-Primärschlüssel verwiesen. Dies wurde durch falsche alter table-Befehle verursacht. Ich habe dies herausgefunden, indem ich die INFORMATION_SCHEMA-Tabelle abfragte (Siehe diese stackoverflow-Antwort)
Die Tabelle war so verwirrt, dass sie nicht durch ALTER TABLE -Befehle behoben werden konnte. Ich ließ den Tisch endlich fallen und rekonstruierte ihn. Dadurch wurde der Integritätsfehler beseitigt.
Gibt es irgendwelche vorhandenen Daten, die die Tabelle enthält? Versuchen Sie in diesem Fall, alle Daten in der Tabelle zu löschen, für die 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. Das Löschen aller Daten in der Tabelle funktioniert, wenn Sie einen Fremdschlüssel zu einer vorhandenen Tabelle hinzufügen möchten.
Hoffe das funktioniert :)
Während Sie die userID
-Spalte hinzugefügt haben, gibt es möglicherweise Daten für diese bestimmte Tabelle, die erstellt wird, so dass sie einen Standardwert von 0
hat. Versuchen Sie, die Spalte ohne NOT NULL
hinzuzufügen.
Ich hatte auch das gleiche Problem und das Problem bestand darin, dass der Wert der übergeordneten Tabelleneinträge nicht mit dem Wert der Fremdschlüsseltabelle übereinstimmt.
Ich habe auch diese Fehlermeldung erhalten: "Eine untergeordnete Zeile kann nicht hinzugefügt oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl". Beim Hinzufügen einer neuen Zeile zur übergeordneten Tabelle wurde der Fehler angezeigt
Das Problem war, dass die Fremdschlüsseleinschränkung in der übergeordneten Tabelle anstelle der untergeordneten Tabelle definiert wurde.
Wenn Sie den MySQL-Index oder die Relation zwischen Tabellen verwenden, löschen Sie zuerst die Spalten (zum Beispiel: city_id) und erstellen Sie neue Spalten mit demselben Namen (zum Beispiel: city_id).