Fehlercode: 1005. Tabelle '…' kann nicht erstellt werden (Fehler: 150)

103

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
Lamostreta
quelle
Können Sie das Schema für die metal_kodTabelle anzeigen ... auf welches Feld in dieser Tabelle sollte der Fremdschlüssel verweisen?
Manse

Antworten:

271

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:

  1. Die beiden Schlüsselfelder Typ und / oder Größe stimmen nicht genau überein. Zum Beispiel, wenn man INT(10)das Schlüsselfeld ist, muss es INT(10)auch sein und nicht INT(11)oder TINYINT. Möglicherweise möchten Sie die Feldgröße mit bestätigen, SHOW CREATE TABLEda der Abfragebrowser manchmal nur INTEGERfür beide INT(10)und visuell angezeigt wird INT(11). Sie sollten auch überprüfen, ob dies nicht SIGNEDder Fall ist und der andere UNSIGNED. Sie müssen beide genau gleich sein.
  2. Eines der Schlüsselfelder, auf die Sie verweisen möchten, hat keinen Index und / oder ist kein Primärschlüssel. Wenn eines der Felder in der Beziehung kein Primärschlüssel ist, müssen Sie einen Index für dieses Feld erstellen.
  3. Der Fremdschlüsselname ist ein Duplikat eines bereits vorhandenen Schlüssels. Überprüfen Sie, ob der Name Ihres Fremdschlüssels in Ihrer Datenbank eindeutig ist. Fügen Sie einfach ein paar zufällige Zeichen am Ende Ihres Schlüsselnamens hinzu, um dies zu testen.
  4. Eine oder beide Ihrer Tabellen sind MyISAMTabellen. Um Fremdschlüssel verwenden zu können, müssen die Tabellen beide sein InnoDB. (Wenn beide Tabellen vorhanden sind MyISAM, wird keine Fehlermeldung angezeigt, der Schlüssel wird nur nicht erstellt.) Im Abfragebrowser können Sie den Tabellentyp angeben.
  5. Sie haben eine Kaskade angegeben ON DELETE SET NULL, aber das entsprechende Schlüsselfeld ist auf gesetzt NOT NULL. Sie können dies beheben, indem Sie entweder Ihre Kaskade ändern oder das Feld so einstellen, dass NULLWerte zulässig sind.
  6. Stellen Sie sicher, dass die Optionen Zeichensatz und Sortieren sowohl auf Tabellenebene als auch auf Ebene der einzelnen Felder für die Schlüsselspalten identisch sind.
  7. Sie haben einen Standardwert (dh Standard = 0) in Ihrer Fremdschlüsselspalte
  8. Eines der Felder in der Beziehung ist Teil eines Kombinationsschlüssels (zusammengesetzt) ​​und hat keinen eigenen Index. Obwohl das Feld einen Index als Teil des zusammengesetzten Schlüssels enthält, müssen Sie nur für dieses Schlüsselfeld einen separaten Index erstellen, um ihn in einer Einschränkung verwenden zu können.
  9. Sie haben einen Syntaxfehler in Ihrer ALTERAnweisung oder einen der Feldnamen in der Beziehung falsch eingegeben
  10. Der Name Ihres Fremdschlüssels überschreitet die maximale Länge von 64 Zeichen.

Weitere Informationen finden Sie unter: MySQL-Fehlernummer 1005 Tabelle kann nicht erstellt werden

Peter Mortensen
quelle
4
Das Problem war, dass die Fremdschlüssel-Zeichensätze nicht übereinstimmten. Danke für die Antwort.
Lamostreta
4
SHOW ENGINE INNODB STATUSWie in dieser Frage erwähnt, half mir die Diagnose meines speziellen Problems (PEBCAK, in meinem Fall ...)
Hobo
1
Verdammt, sogar das ist ein Primärschlüssel. Sie müssen einen individuellen Index für diesen Schlüssel erstellen. danke das hat mein problem gelöst.
RSB
3
# 4 war mein Problem - eine der Tabellen war MyISAM und das Skript versuchte, eine InnoDB-Tabelle zu erstellen. Dieses Problem trat auf, als ich versuchte, ein altes System bereitzustellen, auf dem ursprünglich MySQL 5.0 oder eine ähnliche Version ausgeführt wurde, wobei die Standardspeicher-Engine MyISAM war und die Skripts in Ordnung waren. Meine aktuelle Umgebung ist 5.5 und der Standardspeicher ist InnoDB. Das Hinzufügen 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)
Boris
1
Bei mir fehlte das Attribut 'unsigned', wie in # 1 erwähnt, danke!
Helvete
11

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:

SET FOREIGN_KEY_CHECKS=0;

und es soll funktionieren.

happyhardik
quelle
4

Sehr oft kommt es vor, dass der Fremdschlüssel und der Referenzschlüssel nicht denselben Typ oder dieselbe Länge haben.

zahid9i
quelle
4

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.

Rajug
quelle
2

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.

CREATE TABLE IF NOT EXISTS `country` (`id` INT(11) NOT NULL AUTO_INCREMENT,...) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

... in der SQL-Anweisung bedeutet, dass Code fehlt.

user2258168
quelle
2

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.

CREATE TABLE employees(
id_empl INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE offices(
id_office INT UNSIGNED NOT NULL AUTO_INCREMENT,
id_empl INT UNSIGNED NOT NULL,
PRIMARY KEY(id),
CONSTRAINT `constraint1` FOREIGN KEY (`id_empl`) REFERENCES `employees` (`id_empl`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='my offices';
Yaina Villafañes
quelle
unsigniert war das Problem für mich. Vielen Dank!
Gabo
2

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

  1. Die Fremdschlüsselnamen wurden geändert (es hat nicht funktioniert)
  2. Die Fremdschlüssellänge wurde reduziert
  3. Verifizierte die Datentypen (verdammt nichts falsch)
  4. Überprüfen Sie die Indizes
  5. Überprüfen Sie die Kollatierungen (alles in Ordnung, verdammt noch mal)
  6. Die Tabelle abgeschnitten, ohne guten Nutzen
  7. Die Tabelle wurde gelöscht und neu erstellt
  8. Versucht zu sehen, ob ein Zirkelverweis erstellt wird - alles in Ordnung
  9. 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.

Rajiv Nair
quelle
2

Ich hatte die gleiche Fehlermeldung. Schließlich stellte ich fest, dass ich den Namen der Tabelle im Befehl falsch geschrieben hatte:

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES country (id);

gegen

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES countries (id);

Ich frage mich, warum MySQL nicht sagen kann, dass eine solche Tabelle nicht existiert ...

Csongor Halmai
quelle
1

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.

CREATE TABLE IF NOT EXISTS `tablename` (
  `key` bigint(20) NOT NULL AUTO_INCREMENT,
  FOREIGN KEY `key` (`key`) REFERENCES `othertable`(`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
Damir Olejar
quelle
1

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.

rkawano
quelle
1

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

ALTER TABLE `Window` ADD CONSTRAINT `Windows_ibfk_1` FOREIGN KEY (`WallId`) REFERENCES `Wall` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
Abdellah Alaoui
quelle
1

Überprüfen Sie, ob beide Tabellen dasselbe Schema haben. InnoDB MyISAM. Ich habe sie in meinem Fall InnoDB alle gleich gemacht und gearbeitet

Brian Sanchez
quelle
1

Mein Problem wurde nicht aufgelistet, es war etwas so Dummes ..... Die Tabelle mit dem FKals PK war ein Verbund PK, der wie folgt deklariert wurde: Primärschlüssel ( CNPJ, CEP) Ich wollte, dass sich das CEP-Feld in einer FKanderen 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.

Fagner Willys
quelle