Ich habe im Internet nach einer Lösung für dieses Problem gesucht und die Fragen zum Stapelüberlauf überprüft, aber keine der Lösungen hat für meinen Fall funktioniert.
Ich möchte einen Fremdschlüssel von der Tabelle sira_no bis metal_kod erstellen.
ALTER TABLE sira_no
ADD CONSTRAINT METAL_KODU FOREIGN KEY(METAL_KODU)
REFERENCES metal_kod(METAL_KODU)
ON DELETE SET NULL
ON UPDATE SET NULL ;
Dieses Skript gibt Folgendes zurück:
Error Code: 1005. Can't create table 'ebs.#sql-f48_1a3' (errno: 150)
Ich habe versucht, der referenzierten Tabelle einen Index hinzuzufügen:
CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU);
Ich habe METAL_KODU für beide Tabellen (Zeichensatz und Sortierung) überprüft, aber keine Lösung für dieses Problem gefunden. Wie kann ich dieses Problem beheben?
Hier ist die Tabelle metal_kod:
METAL_KODU varchar(4) NO PRI
DURUM bit(1) NO
METAL_ISMI varchar(30) NO
AYAR_YOGUNLUK smallint(6) YES 100
mysql
foreign-keys
mysql-error-1005
Lamostreta
quelle
quelle
metal_kod
Tabelle anzeigen ... auf welches Feld in dieser Tabelle sollte der Fremdschlüssel verweisen?Antworten:
Fehlercode: 1005 - Ihr Code enthält eine falsche Primärschlüsselreferenz
Normalerweise liegt es an einem Fremdschlüsselfeld, auf das verwiesen wird und das nicht vorhanden ist. Es kann sein, dass Sie einen Tippfehler haben oder prüfen, ob er gleich sein sollte, oder dass ein Feldtyp nicht übereinstimmt. Mit Fremdschlüsseln verknüpfte Felder müssen genau mit den Definitionen übereinstimmen.
Einige bekannte Ursachen können sein:
INT(10)
das Schlüsselfeld ist, muss esINT(10)
auch sein und nichtINT(11)
oderTINYINT
. Möglicherweise möchten Sie die Feldgröße mit bestätigen,SHOW
CREATE
TABLE
da der Abfragebrowser manchmal nurINTEGER
für beideINT(10)
und visuell angezeigt wirdINT(11)
. Sie sollten auch überprüfen, ob dies nichtSIGNED
der Fall ist und der andereUNSIGNED
. Sie müssen beide genau gleich sein.MyISAM
Tabellen. Um Fremdschlüssel verwenden zu können, müssen die Tabellen beide seinInnoDB
. (Wenn beide Tabellen vorhanden sindMyISAM
, wird keine Fehlermeldung angezeigt, der Schlüssel wird nur nicht erstellt.) Im Abfragebrowser können Sie den Tabellentyp angeben.ON
DELETE
SET
NULL
, aber das entsprechende Schlüsselfeld ist auf gesetztNOT
NULL
. Sie können dies beheben, indem Sie entweder Ihre Kaskade ändern oder das Feld so einstellen, dassNULL
Werte zulässig sind.ALTER
Anweisung oder einen der Feldnamen in der Beziehung falsch eingegebenWeitere Informationen finden Sie unter: MySQL-Fehlernummer 1005 Tabelle kann nicht erstellt werden
quelle
SHOW ENGINE INNODB STATUS
Wie in dieser Frage erwähnt, half mir die Diagnose meines speziellen Problems (PEBCAK, in meinem Fall ...)set names 'utf8', storage_engine=MYISAM;
am Anfang des Skripts löste das Problem für mich. Vielen Dank an @ user319198 und @Stefano für die ausführliche Antwort! : o)Dies kann auch passieren, wenn Sie Ihre Datenbank von einem Server auf einen anderen exportieren und die Tabellen standardmäßig in alphabetischer Reihenfolge aufgelistet sind.
Ihre erste Tabelle könnte also einen Fremdschlüssel einer anderen Tabelle haben, die noch erstellt werden muss. Deaktivieren Sie in solchen Fällen Foreign_key_checks und erstellen Sie die Datenbank.
Fügen Sie Ihrem Skript einfach Folgendes hinzu:
und es soll funktionieren.
quelle
Sehr oft kommt es vor, dass der Fremdschlüssel und der Referenzschlüssel nicht denselben Typ oder dieselbe Länge haben.
quelle
Manchmal liegt es daran, dass die Mastertabelle gelöscht wird (möglicherweise durch Deaktivieren von Foreign_key_checks), aber der Fremdschlüssel CONSTRAINT ist in anderen Tabellen noch vorhanden. In meinem Fall hatte ich die Tabelle gelöscht und versucht, sie neu zu erstellen, aber es gab den gleichen Fehler für mich.
Versuchen Sie also, alle Fremdschlüsseleinschränkungen aus allen Tabellen zu entfernen, falls vorhanden, und aktualisieren oder erstellen Sie die Tabelle.
quelle
Ich hatte einen ähnlichen Fehler. Das Problem hatte damit zu tun, dass die untergeordnete und die übergeordnete Tabelle nicht denselben Zeichensatz und dieselbe Sortierung hatten. Dies kann durch Anhängen von ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 behoben werden.
... in der SQL-Anweisung bedeutet, dass Code fehlt.
quelle
Der Fremdschlüssel muss genau den gleichen Typ haben wie der Primärschlüssel, auf den er verweist. Für das Beispiel mit dem Typ "INT UNSIGNED NOT NULL" muss der Vorschlüssel auch "INT UNSIGNED NOT NULL" sein.
quelle
Fehlercode: 1005
Ich hatte ein ähnliches Problem, daher sind hier einige Dinge, die ich ausprobiert habe (nicht in beliebiger Reihenfolge, außer für die Lösung :))
Schließlich sah ich, dass ich zwei Redakteure geöffnet hatte. Eine in PhpStorm (JetBrains) und die andere in MySQL Workbench. Es scheint, dass die PhpStorm / MySQL Workbench eine Art Bearbeitungssperre erstellt.
Ich habe PhpStorm geschlossen, um zu überprüfen, ob das Sperren der Fall war (es hätte auch umgekehrt sein können). Dies löste mein Problem.
quelle
Ich hatte die gleiche Fehlermeldung. Schließlich stellte ich fest, dass ich den Namen der Tabelle im Befehl falsch geschrieben hatte:
gegen
Ich frage mich, warum MySQL nicht sagen kann, dass eine solche Tabelle nicht existiert ...
quelle
MyISAM wurde gerade erwähnt. Versuchen Sie einfach, ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 2 hinzuzufügen . am Ende einer Anweisung, vorausgesetzt, Ihre anderen Tabellen wurden mit MyISAM erstellt.
quelle
In meinem Fall ist es passiert, wenn eine Tabelle InnoB und die andere MyISAM ist. Das Ändern der Engine einer Tabelle über MySQL Workbench löst für mich eine Lösung.
quelle
In meinem Fall ist dies passiert, weil der Name der Tabelle, auf die in der Einschränkungsdeklaration verwiesen wird, nicht korrekt war (ich habe den Großbuchstaben im Tabellennamen vergessen):
quelle
Überprüfen Sie, ob beide Tabellen dasselbe Schema haben. InnoDB MyISAM. Ich habe sie in meinem Fall InnoDB alle gleich gemacht und gearbeitet
quelle
Mein Problem wurde nicht aufgelistet, es war etwas so Dummes ..... Die Tabelle mit dem
FK
als PK war ein VerbundPK
, der wie folgt deklariert wurde: Primärschlüssel (CNPJ
,CEP
) Ich wollte, dass sich das CEP-Feld in einerFK
anderen Tabelle befindet, und das war ich auch In diesem Fehler steckte die Moral der Geschichte den obigen Code für Primärschlüssel (CEP
,CNPJ
) um und es funktionierte. Holen Sie sich Trinkgeld für ihre Freunde.quelle