webentwicklung-frage-antwort-db.com.de

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

Ich habe im Internet nach einer Lösung für dieses Problem gesucht und die Fragen zum Stapelüberlauf geprüft, aber keine der Lösungen hat für meinen Fall funktioniert.

Ich möchte einen Fremdschlüssel von der Tabelle sira_no zu 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 in beiden Tabellen (Zeichensatz und Kollatierung) überprüft, konnte jedoch keine Lösung für dieses Problem finden. Wie kann ich dieses Problem beheben?

Hier ist die metal_kod-Tabelle:

METAL_KODU    varchar(4)    NO    PRI
DURUM    bit(1)    NO
METAL_ISMI    varchar(30)    NO
AYAR_YOGUNLUK    smallint(6)    YES        100
99
lamostreta

Fehlercode: 1005 - Ihr Code enthält einen falschen Primärschlüsselverweis

Normalerweise liegt es an einem referenzierten Fremdschlüsselfeld, das nicht existiert. Es kann sein, dass Sie einen Tippfehler haben oder überprüfen, ob er gleich sein sollte, oder dass ein feldartiger Konflikt vorliegt. Mit Fremdschlüsseln verknüpfte Felder müssen exakt mit den Definitionen übereinstimmen.

Einige bekannte Ursachen können sein:

  1. Die beiden Schlüsselfelder Typ und/oder Größe stimmen nicht genau überein. Wenn zum Beispiel INT(10) ist, muss das Schlüsselfeld auch INT(10) sein und nicht INT(11) oder TINYINT. Möglicherweise möchten Sie die Feldgröße mit SHOWCREATETABLE bestätigen, da der Abfrage-Browser manchmal nur INTEGER für beide INT(10) anzeigt. und INT(11). Sie sollten auch überprüfen, ob einer nicht SIGNED und der andere UNSIGNED ist. 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 an das Ende Ihres Schlüsselnamens an, um dies zu testen.
  4. Eine oder beide Ihrer Tabellen sind eine MyISAM - Tabelle. Um Fremdschlüssel zu verwenden, müssen beide Tabellen InnoDB sein. (Wenn beide Tabellen MyISAM sind, wird keine Fehlermeldung angezeigt. Der Schlüssel wird nur erstellt.) Im Abfrage-Browser können Sie den Tabellentyp angeben.
  5. Sie haben eine Kaskade ONDELETESETNULL angegeben, aber das entsprechende Schlüsselfeld ist auf NOTNULL gesetzt. . Sie können dies beheben, indem Sie entweder Ihre Kaskade ändern oder das Feld so einstellen, dass Werte von NULL zulässig sind.
  6. Stellen Sie sicher, dass die Optionen Zeichensatz und Sortieren sowohl auf Tabellenebene als auch auf der Ebene der einzelnen Felder für die Schlüsselspalten identisch sind.
  7. Sie haben einen Standardwert (d. H. Standardwert = 0) in Ihrer Fremdschlüsselspalte
  8. Eines der Felder in der Beziehung ist Teil eines Kombinationsschlüssels (zusammengesetzten Schlüssels) 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 es in einer Einschränkung zu verwenden.
  9. In Ihrer ALTER - Anweisung ist ein Syntaxfehler aufgetreten, oder Sie haben 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 Kann keine Tabelle erstellen

261
user319198

Dies kann auch passieren, wenn Sie Ihre Datenbank von einem Server auf einen anderen exportieren und die Tabellen standardmäßig in alphabetischer Reihenfolge aufgeführt sind.
Ihre erste Tabelle könnte also einen Fremdschlüssel einer anderen Tabelle haben, die noch erstellt werden muss. In solchen Fällen deaktivieren Sie 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.

11
happyhardik

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 my Fall hatte ich die Tabelle fallen gelassen und versucht, sie neu zu erstellen, aber es wurde der gleiche Fehler für mich ausgelöst.

Versuchen Sie also, alle Fremdschlüssel-CONSTRAINTs aus allen Tabellen zu löschen, falls vorhanden, und aktualisieren oder erstellen Sie die Tabelle.

4
rajug

Sehr oft passiert es, wenn der Fremdschlüssel und der Referenzschlüssel nicht den gleichen Typ oder die gleiche Länge haben.

3
zahid9i

Ich hatte einen ähnlichen Fehler. Das Problem hatte damit zu tun, dass untergeordnete und ü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.

2
user2258168

Fehlercode: 1005

Ich hatte ein ähnliches Problem, daher hier ein paar Dinge, die ich ausprobiert habe (nicht in beliebiger Reihenfolge, außer für die Lösung :))

  1. Fremdschlüsselnamen geändert (es hat nicht funktioniert)
  2. Reduziert die Fremdschlüssellänge
  3. Überprüfte die Datentypen (verdammt nichts falsches)
  4. Überprüfen Sie die Indizes
  5. Überprüfen Sie die Kollatierungen (alles in Ordnung, verdammt noch mal)
  6. Den Tisch abgeschnitten, ohne Sinn
  7. Die Tabelle gelöscht und neu erstellt
  8. Versucht zu sehen, ob ein Zirkelverweis erstellt wird - alles in Ordnung
  9. Schließlich habe ich gesehen, dass zwei Editoren geöffnet waren. Einer in PhpStorm (JetBrains) und der andere in der 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 hat mein Problem gelöst.

2
Rajiv Nair

Dies ist in meinem Fall 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;
1
Abdellah Alaoui

Der Fremdschlüssel muss genau den gleichen Typ haben wie der Primärschlüssel, auf den er verweist. Für das Beispiel vom Typ "INT UNSIGNED NOT NULL" muss der Vorgängerschlüssel ebenfalls "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';
1

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

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

versus

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

Ich frage mich, warum um alles in der Welt MySQL nicht sagen kann, dass eine solche Tabelle nicht existiert ...

1
Csongor Halmai

In meinem Fall passierte es, wenn eine Tabelle InnodB und die andere MyISAM ist. Das Ändern der Engine einer Tabelle über MySQL Workbench löst für mich.

0
rkawano

MyISAM wurde gerade erwähnt. Fügen Sie einfach ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 2; am Ende einer Anweisung hinzu, sofern Ihre anderen Tabellen mit MyISAM erstellt wurden.

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 ;
0
Damir Olejar