Ich habe zwei Tabellen, table1
ist die übergeordnete Tabelle mit einer Spalte ID
und table2
mit einer Säule IDFromTable1
(nicht der tatsächliche Name) , wenn ich ein FK legte IDFromTable1
um ID
in table1
ich den Fehler Foreign key constraint is incorrectly formed error
. Ich möchte den Datensatz in Tabelle 2 löschen, wenn der table1
Datensatz gelöscht wird. Vielen Dank für jede Hilfe
ALTER TABLE `table2`
ADD CONSTRAINT `FK1`
FOREIGN KEY (`IDFromTable1`) REFERENCES `table1` (`ID`)
ON UPDATE CASCADE
ON DELETE CASCADE;
Lassen Sie mich wissen, wenn weitere Informationen benötigt werden. Ich bin neu in MySQL
table2.IDFromTable1
undtable1.ID
?Antworten:
Ich bin mit HeidiSQL auf dasselbe Problem gestoßen. Der Fehler, den Sie erhalten, ist sehr kryptisch. Mein Problem war schließlich, dass die Fremdschlüsselspalte und die Referenzierungsspalte nicht vom gleichen Typ oder der gleichen Länge waren.
Die Fremdschlüsselspalte war
SMALLINT(5) UNSIGNED
und die referenzierte Spalte warINT(10) UNSIGNED
. Nachdem ich beide genau den gleichen Typ erstellt hatte, funktionierte die Erstellung des Fremdschlüssels perfekt.quelle
Ich hatte das gleiche Problem, als die übergeordnete Tabelle mit der
MyISAM
Engine erstellt wurde. Es ist ein dummer Fehler, den ich behoben habe:quelle
Stellen Sie sicher, dass die Spalten identisch sind (vom gleichen Typ), und wenn dies nicht der Fall ist
primary_key
, stellen Sie sicher, dass dies der Fall istINDEXED
.quelle
KEY referencing_column(referencing_column)
VOR der Definition beider Fremdschlüssel wurden beide erfolgreich hinzugefügt :)Die Syntax zum Definieren von Fremdschlüsseln ist sehr nachsichtig, aber für alle anderen, die sich damit auseinandersetzen, gilt die Tatsache, dass Fremdschlüssel "vom gleichen Typ" sein müssen, auch für die Sortierung, nicht nur für Datentyp, Länge und Bitsignatur.
Nicht, dass Sie die Kollatierung in Ihrem Modell mischen würden (oder?), Aber wenn Sie dies tun, stellen Sie sicher, dass Ihre Primär- und Fremdschlüsselfelder in phpmyadmin oder Heidi SQL oder was auch immer Sie verwenden, vom gleichen Kollatierungstyp sind.
Ich hoffe, das erspart Ihnen die vier Stunden Versuch und Irrtum, die es mich gekostet hat.
quelle
COLLATE utf8mb4_unicode_ci
mein (unerwartetes) Problem (auf dem Entwicklungscomputer).Ich hatte das gleiche Problem, löste es aber.
So stellen Sie sicher , dass Spalte ‚ID‘ in ‚Tabelle1‘ hat UNIQUE Index!
Und natürlich müssen Typ und Länge der Spalten 'ID' und 'IDFromTable1' in diesen beiden Tabellen gleich sein. Aber das wissen Sie schon.
quelle
Nur zur Fertigstellung.
Dieser Fehler kann auch auftreten, wenn Sie einen Fremdschlüssel mit VARCHAR (..) haben und sich der Zeichensatz der referenzierten Tabelle von der Tabelle unterscheidet, auf die verwiesen wird.
Beispiel: VARCHAR (50) in einer Latin1-Tabelle unterscheidet sich von VARCHAR (50) in einer UTF8-Tabelle.
quelle
MySQL-Fehlertexte helfen nicht so viel. In meinem Fall hatte die Spalte die Einschränkung "nicht null", sodass die Einstellung "beim Löschen auf null gesetzt" nicht zulässig war
quelle
Wenn alles in Ordnung ist, fügen Sie es einfach
->unsigned();
am Ende von hinzuforegin key
.Wenn dies nicht funktioniert, überprüfen Sie den Datentyp beider Felder. Sie müssen gleich sein.
quelle
Ich hatte das gleiche Problem, beide Spalten waren INT (11) NOT NULL, aber ich kann den Fremdschlüssel nicht erstellen. Ich musste Fremdschlüsselprüfungen deaktivieren, um es erfolgreich auszuführen:
Hoffe das hilft jemandem.
quelle
Eine weitere wahrscheinliche Ursache für die Anzeige dieses Fehlers. Die Reihenfolge, in der ich Tabellen erstellt habe, war falsch. Ich habe versucht, auf einen Schlüssel aus einer Tabelle zu verweisen, die noch nicht erstellt wurde.
quelle
(Last Resent) Auch wenn der Feldname und der Datentyp identisch sind, die Sortierung jedoch nicht identisch ist, führt dies ebenfalls zu diesem Problem.
Beispielsweise
Versuchen Sie es zu ändern
....
Das hat bei mir funktioniert.
quelle
Überprüfen Sie die Tabellen-Engine, beide Tabellen müssen dieselbe Engine sein, das hat mir sehr geholfen.
quelle
SHOW TABLE STATUS LIKE 'table_name';
Ich hatte die gleichen Probleme.
Das Problem ist, dass die Referenzspalte kein Primärschlüssel ist.
Machen Sie es zu einem Primärschlüssel und das Problem ist gelöst.
quelle
Obwohl die anderen Antworten sehr hilfreich sind, wollte ich nur meine Erfahrungen teilen.
Ich hatte das Problem, als ich eine Tabelle gelöscht hatte
id
, auf die in anderen Tabellen ( mit Daten ) bereits als Fremdschlüssel verwiesen wurde, und versuchte, die Tabelle mit einigen zusätzlichen Spalten neu zu erstellen / zu importieren.Die Abfrage für die Neuerstellung (generiert in phpMyAdmin) sah folgendermaßen aus:
Wie Sie vielleicht bemerken, wurde der
PRIMARY KEY
Index nach der Erstellung ( und dem Einfügen von Daten) festgelegt ) festgelegt, die das Problem verursacht hat.Lösung
Die Lösung bestand darin, den
PRIMARY KEY
Index für die Tabellendefinitionsabfrage für denid
Schlüssel hinzuzufügen, auf den als Fremdschlüssel verwiesen wurde, und ihn gleichzeitig aus demALTER TABLE
Teil zu entfernen, in dem die Indizes festgelegt wurden:quelle
Dafür habe ich stundenlang verloren!
PK in einem Tisch war
utf8
in einem anderen warutf8_unicode_ci
!quelle
Versuchen Sie Folgendes auszuführen:
quelle
Ich hatte das gleiche Problem mit Symfony 2.8.
Ich habe es zuerst nicht verstanden, weil es keine ähnlichen Probleme mit der Länge von Fremdschlüsseln usw. gab.
Schließlich musste ich im Projektordner Folgendes tun. (Ein Neustart des Servers hat nicht geholfen!)
app/console doctrine:cache:clear-metadata app/console doctrine:cache:clear-query app/console doctrine:cache:clear-result
quelle
danke S Doerin:
"Nur zur Vervollständigung. Dieser Fehler kann auch der Fall sein, wenn Sie einen Fremdschlüssel mit VARCHAR (..) haben und der Zeichensatz der referenzierten Tabelle sich von der Tabelle unterscheidet, auf die verwiesen wird. Beispiel: VARCHAR (50) in einer Latin1-Tabelle ist anders als das VARCHAR (50) in einer UTF8-Tabelle. "
Ich habe dieses Problem gelöst und die Art der Zeichen der Tabelle geändert. Die Erstellung hat latin1 und das richtige ist utf8.
Fügen Sie die nächste Zeile hinzu. DEFAULT CHARACTER SET = utf8;
quelle
Ich hatte Probleme bei der Verwendung der Tabelle "Ändern", um einen Fremdschlüssel zwischen zwei Tabellen hinzuzufügen, und half mir dabei, sicherzustellen, dass jede Spalte, zu der ich eine Fremdschlüsselbeziehung hinzufügen wollte, indiziert war. So tun Sie dies in PHP myAdmin: Gehen Sie zur Tabelle und klicken Sie auf die Registerkarte Struktur. Klicken Sie auf die Indexoption, um die gewünschte Spalte zu indizieren, wie im Screenshot gezeigt:
Nachdem ich beide Spalten indiziert hatte, auf die ich mit meinen Fremdschlüsseln verweisen wollte, konnte ich die Änderungstabelle erfolgreich verwenden und die Fremdschlüsselbeziehung erstellen. Sie werden sehen, dass die Spalten wie im folgenden Screenshot indiziert sind:
Beachten Sie, wie die Postleitzahl in beiden Tabellen angezeigt wird.
quelle
Sie müssen überprüfen, ob beide in allen Eigenschaften gleich sind, einschließlich in "Sortierung".
quelle
Ich habe HeidiSQL verwendet und um dieses Problem zu lösen, musste ich einen Index in der referenzierten Tabelle erstellen, in dem alle Spalten referenziert sind.
quelle
Ich bin gerade auf das gleiche Problem gestoßen. In meinem Fall musste ich lediglich sicherstellen, dass die Tabelle, auf die ich im Fremdschlüssel verweise, vor der aktuellen Tabelle (früher im Code) erstellt werden muss. Wenn Sie also auf eine Variable (x * 5) verweisen, sollte das System wissen, was x ist (x muss in früheren Codezeilen deklariert werden). Dies hat mein Problem gelöst, hoffe, es wird jemand anderem helfen.
quelle
Ich hatte das gleiche Problem mit Laravel 5.1 Migration Schema Builder mit MariaDB 10.1.
Das Problem war, dass ich getippt hatte
unigned
beim Einstellen der Spalte anstelle vonunsigned
(ders
Buchstabe fehlte) .Nach dem Beheben wurde der Tippfehler für mich behoben.
quelle
Sogar ich bin auf das gleiche Problem mit MySQL und Liquibase gestoßen. Das Problem ist also: Die Tabelle, aus der Sie auf eine Spalte einer anderen Tabelle verweisen möchten, unterscheidet sich entweder im Fall eines Datentyps oder in Bezug auf die Größe des Datentyps.
quelle
Überprüfen Sie, ob Sie den Namen der Tabelle im richtigen Fall angegeben haben (wenn bei Tabellennamen in Ihrer Datenbank zwischen Groß- und Kleinschreibung unterschieden wird). In meinem Fall musste ich mich ändern
zu
Beachten Sie die
customer
geänderten zuCUSTOMER
.quelle
Oder Sie können DBDesigner4 verwenden, das über eine grafische Oberfläche verfügt, um Ihre Datenbank zu erstellen und mit FK zu verknüpfen. Klicken Sie mit der rechten Maustaste auf Ihre Tabelle und wählen Sie "Tabelle SQL erstellen erstellen", um den Code zu erstellen.
quelle
Es ist ein altes Thema, aber ich habe etwas entdeckt. Beim Erstellen einer MySQL-Workbench werden auch die Beziehungen der anderen Tabelle abgerufen. Lassen Sie einfach die Säulen, auf die Sie sich beziehen. Löschen Sie andere automatisch hinzugefügte Spalten. Das funktioniert bei mir.
quelle
Mein Fall war, dass ich einen Tippfehler in der angegebenen Spalte hatte:
Die Fehlermeldung ist ziemlich kryptisch und ich habe alles versucht - die Typen der Spalten, Kollatierungen, Engines usw. zu überprüfen.
Ich habe eine Weile gebraucht, um den Tippfehler zu notieren, und nachdem ich alles behoben hatte, funktionierte alles einwandfrei:
quelle
Ich bin mit diesem Problem konfrontiert. Der Fehler trat auf, wenn Sie den Primärschlüssel in einen anderen Datentyp wie:
Tabelle 1:
Tabelle 2:
Der Datentyp für die ID der zweiten Tabelle muss inkrementell sein
quelle
Das Problem ist sehr einfach zu lösen
Beispiel: Sie haben zwei Tabellen mit Namen für Benutzer und Beiträge und möchten einen Fremdschlüssel in der Beitragstabelle erstellen und verwenden phpMyAdmin
1) Fügen Sie in der Post- Tabelle eine neue Spalte hinzu ( Name : use_id | Typ : wie die ID in der Benutzertabelle | Länge : wie die ID in der Benutzertabelle | Standard : NULL | Attribute : ohne Vorzeichen | Index: INDEX)
2) Gehen Sie auf der Registerkarte Struktur zur Beziehungsansicht ( Einschränkungsname : automatisch festgelegt durch phpmyAdmin | Spaltenname : Wählen Sie Benutzer- ID | Tabelle : Benutzer | Schlüssel : ID, ...).
Es wurde einfach gelöst
quelle