webentwicklung-frage-antwort-db.com.de

Eine untergeordnete Zeile kann nicht hinzugefügt oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl

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.

145
Tom

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.

195
Brian Driscoll

Es bedeutet, dass Sie versuchen, einen UserID-Wert in table2 einzufügen, der in table1 nicht vorhanden ist.

112
Rami C

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.

81
Sandeep Giri

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.

Siehe http://nick.zoic.org/art/mysql-foreign-key-error/

35
NickZoic

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!

13
Justin

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.

10
Attaque

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.

6
Blaztix

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.

  1. Legen Sie fest, dass die Spalte, auf die Fremdschlüsseleinschränkungen angewendet werden sollen, nullbar ist. Auf diese Weise wird der Fremdschlüssel angewendet, wenn man weiß, dass einige Felder null sein können. ( Das habe ich gemacht. )
  2. Erstellen Sie die Spalte, auf die Sie die Fremdschlüsseleinschränkung anwenden möchten, schreiben Sie eine Abfrage, um den Fremdschlüssel in die Spalte einzufügen, und wenden Sie dann die Fremdschlüsseleinschränkungen an. ( Ich habe es nicht probiert, aber es sollte funktionieren )
5
Jacob

Stellen Sie sicher, dass Sie das Datenbankmodul auf InnoDB eingestellt haben, da Fremdschlüssel und Transaktionen in MyISAM nicht unterstützt werden

4
Aman Maurya

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!

2
Dustin Hammack

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.

2
Ouissal

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.

1
Sbudah

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;
1

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.

0
Vicky T

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 :)

0
Noldy

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. 

0
WTFZane

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.

0
Justin Jose

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.

0
Nadir Latif

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).

0
Mahmut Aydın