webentwicklung-frage-antwort-db.com.de

Mysql. Kann Tabelle 150 nicht erstellen

Ich muss eine Datenbank mit 2 Tabellen in Mysql erstellen, aber das Skript schlägt mit Errno 150 (Fremdschlüsselproblem) fehl. Ich habe die Fremdschlüsselfelder in beiden Tabellen auf die gleichen Werte geprüft und kann keine Fehler finden.

Hier ist das Skript:

 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
 SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL';

 DROP SCHEMA IF EXISTS `testdb`;
 CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
 USE `testdb`;

 DROP TABLE IF EXISTS `testdb`.`table1` ;

 CREATE  TABLE IF NOT EXISTS `testdb`.`table1` (
   `id` INT UNSIGNED NOT NULL ,
   `field1` VARCHAR(50) NULL ,
   PRIMARY KEY (`id`) )
 ENGINE = InnoDB;



 DROP TABLE IF EXISTS `testdb`.`table2` ;

 CREATE  TABLE IF NOT EXISTS `testdb`.`table2` (
   `id` INT NOT NULL AUTO_INCREMENT ,
   `field1` VARCHAR(50) NULL ,
   `date` DATE NULL ,
   `cnt` INT NULL ,
   PRIMARY KEY (`id`) ,
   INDEX `FK_table2_table1` (`field1` ASC) ,
   CONSTRAINT `FK_table2_table1`
  FOREIGN KEY (`field1`)
  REFERENCES `testdb`.`table1` (`field1` )
  ON DELETE NO ACTION
  ON UPDATE NO ACTION)
 ENGINE = InnoDB;

 SET [email protected]_SQL_MODE;
 SET [email protected]_FOREIGN_KEY_CHECKS;
 SET [email protected]_UNIQUE_CHECKS;

Ich habe es in Windows und Ubuntu mit verschiedenen Versionen von Mysql ausprobiert und funktionierte nicht.

Irgendwelche Ideen? Danke vielmals.

68
David Espart

Für table1.field1 ist kein Index definiert.

Es ist erforderlich, eine FOREIGN KEY-Einschränkung auf field1 zu setzen.

Mit diesem:

 CREATE  TABLE IF NOT EXISTS `testdb`.`table1` (
   `id` INT UNSIGNED NOT NULL ,
   `field1` VARCHAR(50) NULL ,
   KEY ix_table1_field1 (field1),
   PRIMARY KEY (`id`) )
 ENGINE = InnoDB;

Dann sollte alles wie erwartet funktionieren.

54
Quassnoi

Bei der Arbeit mit MySQL Workbench und MySQL 5.5.27 bin ich auf ein ähnliches Problem gestoßen. In meinem Fall gab es Probleme mit INT-Feldern. In einer Tabelle war dies fälschlicherweise INT UNSIGNED und in der Referenzierungstabelle INT. 

50
Mushtaq Hussain

Je nach Version von MySQL müssen Sie möglicherweise zuerst einen Index für table1.field1 erstellen.

13
atomice

Eine der Antworten hier schlägt vor, die Fremdschlüssel-Integritätsprüfung zu deaktivieren. Dies ist eine schlechte Idee. Es gibt zwei wahrscheinliche Schuldige hier:

  • Datentyp stimmt nicht mit dem referenzierten Primärschlüssel und dem referenzierenden Fremdschlüssel überein
  • Indizes Alle Fremdschlüssel, die Sie indizieren, müssen NICHT NULL sein
8
jwilm

Noch ein Hinweis:

Selbst wenn Ihre Datentypen gleich zu sein scheinen - in meinem Fall hatten beide Spalten VARCHAR(50) - reicht dies nicht aus.

Sie müssen auch sicherstellen, dass beide Spalten die gleiche COLLATION haben.

6
Alex

Eine weitere Ursache, obwohl sie anderen sehr ähnlich ist: Ich bezog sich auf eine Tabelle, die sich als MyISAM-Engine erwies, statt InnoDB.

5
Sherlock

MySQL gibt diesen Fehler auch aus, wenn Sie den Namen der verweisenden Tabelle falsch eingeben. Ich zog meine Haare für eine Weile aus, bis mir klar wurde, dass ich einen Brief in foreign key (column1) references mistyped_table(column1) verpasst hatte.

5
Cfreak

Eine Option (je nach Fall) wäre die Deaktivierung der MySQL-Integritätsprüfung:

SET FOREIGN_KEY_CHECKS = 0;
5
pl1nk

Wenn nichts funktioniert, versuchen Sie Folgendes:

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.

1
Arvind Bhardwaj

Wenn Sie an mysql workbench arbeiten und dieser Fehler für eine Beziehungstabelle angezeigt wird, gibt es möglicherweise eine schnelle Lösung für Sie: Löschen Sie ihn einfach und lassen Sie ihn von mysql workbench neu erstellen. Dann kopieren Sie die SQL. Mein Errno 150 Problem wurde behoben.

0
clinical

Ich habe diese Fehlermeldung erhalten, als ich versuchte, einen Fremdschlüssel zu verwenden, um auf ein nicht eindeutiges Feld zu verweisen. (was anscheinend nicht erlaubt ist)

0
Matthias

Für mich war das Problem die Verwendung von CONSTRAINT in der CREATE TABLE-Abfrage. 

0
Patrick Moore

In sehr merkwürdigen Fällen kann Ihre Datenbank beschädigt werden. In meinem Fall hatte ich keine Fremdschlüssel auf dem Tisch und das einzige Umbenennen der Tabelle oder das Ändern der Engine hat geholfen.

Es stellte sich heraus, dass innoDB defekt war, siehe: https://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted-while-tried- to-a? lq = 1

0
PiTheNumber

In meinem Fall war es wahrscheinlich ein Serverfehler, der eine Tabelle mit demselben Namen löschte. Das Löschen des gesamten Shcemas und das erneute Erstellen löste das Problem.

0
daVe

Ich habe MySQL workBench verwendet. Das Problem ist, dass Sie nicht denselben foreign key name verwenden können, sie müssen unique sein. Wenn also mehr als eine Tabelle auf denselben Fremdschlüssel verweist, muss jedes Mal ein unique-Name angegeben werden.

0

Wenn Sie versuchen, einen zusammengesetzten Schlüssel in Ihrem Fremdschlüssel zu referenzieren, wird möglicherweise derselbe Fehler angezeigt. 

Zum Beispiel:

CREATE TABLE `article` (
  `id` int(10) unsigned NOT NULL,
  `type` enum('X','Y','Z') NOT NULL,
  PRIMARY KEY (`id`,`type`)
) ENGINE InnoDB;

CREATE TABLE `t1` (
  `user_id` int(10) unsigned NOT NULL,
  `type` enum('X','Y','Z') NOT NULL,
  `article_id` int(10) unsigned NOT NULL,
  CONSTRAINT `user_access_article_ibfk_2` FOREIGN KEY (`article_id`, `type`) REFERENCES `article` (`id`, `type`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB

In diesem Fall ist es wichtig, das Feld article_id und type in der FK-Definition in derselben Reihenfolge wie in der Definition der Artikeltabelle PRIMARY KEY zu verwenden.

0
crocodile2u

Falls noch Probleme damit auftreten, habe ich alle oben genannten Lösungen ausprobiert (außer SET FOREIGN_KEY_CHECKS) und nichts hat funktioniert. Wenn Sie auf die erste Tabelle verweisen, besteht bei einigen Datenbanken die Groß- und Kleinschreibung bei den Tabellennamen. Ich denke, das ist seltsam, da ich das noch nie zuvor in MySQL und Oracle gesehen habe, und jetzt ist mir dies in MariaDB passiert.

Zum Beispiel:

Tabelle erstellen, falls nicht vorhanden CADASTRO_MAQUINAS ( Id VARCHAR (16), Primärschlüssel (Id) );

Tabelle erstellen, falls nicht vorhanden INFOS ( Id_Maquina VARCHAR (16) NOT NULL, CONSTRAINT FK_infos_cadastro_maquinas Fremdschlüssel (Id_Maquina) verweist auf CADASTRO_MAQUINAS (Id)

Wenn ich versuche, die zweite Tabelle mit cadastro_maquinas (Kleinbuchstaben) anstelle von CADASTRO_MAQUINAS zu erstellen, erhalte ich diese Fehlermeldung.

0
Vini.g.fer

In meinem Fall verwendete eine Tabelle Fremdschlüsseleinschränkungen für eine andere Tabelle, die noch nicht vorhanden war. Dies geschah aufgrund eines großen Makefiles, also war es nicht so offensichtlich, wie ich es erwartet hätte.

0
Tyler Collier

Als ich dieses Problem hatte, lag es daran, dass ich die ID in der ersten Tabelle auf unsigned gesetzt hatte, während der Fremdschlüssel in der zweiten Tabelle nicht war. Sie machten beide unsigned für mich.

0
crm

In meinem Fall habe ich die alte Tabellendefinition MyISAM in einer der Tabellen erhalten, und offensichtlich konnte ich aus einer anderen Tabelle keinen Fremdschlüssel erstellen. Vielleicht hilft das jemandem.

Dies kann also aufgrund von Inkonsistenzen zwischen zwei Datenbanken/Felddefinitionen geschehen, die Folgendes überprüfen:

Field Type
Field Collation
Table Engine
0
Radamanf

Erstellen Sie immer zuerst Master-/übergeordnete Tabellen und dann Ihre Detail-/untergeordneten Tabellen.

0
Ruwan Jayalath

Ich hatte einen ähnlichen Fehler an einem meiner Tische. Wenn die Spalte "Sortierreihenfolge" markiert war, funktionierten beide Spalten in den gleichen Sortierungstyp.

Nach dem Lesen der meisten Lösungsvorschläge hier. Ich dachte nur, es wäre hilfreich, wenn ich alle Möglichkeiten auflisten würde, die diesen Fehler auslösen könnten.

1, CASE der Spalte prüfen 2, COLLATION der Spalten prüfen 3, Prüfen, ob in beiden Tabellen ein Schlüssel für die Spalte (eindeutig, primär) erstellt wurde.

0
bumblebee