Frage

Ich habe eine Datenbank mit zwei Tabellen in MySQL erstellen, aber das Skript nicht mit errno 150 (Fremdschlüsselproblem). Ich überprüfte die Fremdschlüsselfelder die gleiche auf beiden Tabellen zu sein, und ich kann keinen Fehler finden.

Hier ist das Skript:

 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
 SET @OLD_SQL_MODE=@@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 SQL_MODE=@OLD_SQL_MODE;
 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Ich habe versucht, es in Windows und Ubuntu mit verschiedenen Versionen von MySQL und habe nicht funktioniert.

Irgendwelche Ideen?

War es hilfreich?

Lösung

table1.field1 hat keinen Index definiert.

Es ist erforderlich, eine FOREIGN KEY Einschränkung für 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;

Alles sollte dann wie erwartet.

Andere Tipps

Während mit MySQL Workbench und MySQL arbeitet 5.5.27, ich habe das ähnliche Problem aufgetreten. In meinem Fall Problem war mit INT Typ Feldern. Irrtümlicherweise in einer Tabelle war es INT UNSIGNED und Tabelle in Referenzierung war es INT.

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

Eine der Antworten hier schlägt die Fremdschlüssel-Integritätsprüfung zu deaktivieren. Dies ist eine schlechte Idee. Es gibt zwei mögliche Täter hier:

  • Datentypkonflikt zwischen referenzierten Primärschlüssel und Fremdschlüssel verweist
  • Indizes. Alle Fremdschlüssel, die Sie Index sein muss NOT NULL

Noch ein Hinweis:

Auch wenn Sie Ihre Datentypen scheinen die gleichen zu sein - in meinem Fall beiden Spalten VARCHAR(50) hatte -. Das ist nicht genug

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

Noch eine andere Sache, wenn auch etwas ähnlich wie andere. Ich bezog sich auf eine Tabelle, die die MyISAM-Engine haben, stellte sich heraus, statt InnoDB

MySQL wird auch diesen Fehler auslösen, wenn Sie den Namen der verweisenden Tabelle vertippen. Ich zog mir die Haare aus für eine Weile, bis ich merkte, ich einen Brief in foreign key (column1) references mistyped_table(column1) verpasst

Eine Option (je nach Fall) wäre es, die MySQL-Integritätsprüfung zu deaktivieren:

SET FOREIGN_KEY_CHECKS = 0;

Wenn nichts funktioniert, versuchen Sie dies:

Der Fremdschlüssel Name ist ein Duplikat eines bereits vorhandenen Schlüssel. Überprüfen Sie, ob der Name des Fremdschlüssel in Ihrer Datenbank eindeutig ist. Fügen Sie einfach ein paar zufällige Zeichen an das Ende Ihrer wichtigsten Namen Test für diese.

In meinem Fall wurde mit einer Tabelle für Fremdschlüssel auf einem anderen Tisch, der noch nicht existierte. Dies geschieht aufgrund einer großen Make-Datei, so dass es nicht so offensichtlich war, wie ich erwartet habe.

Falls jemand noch Probleme mit diesem hat, habe ich versucht, alle die oben genannten Lösungen (mit Ausnahme von SET FOREIGN_KEY_CHECKS) und nichts funktionierte. Das Problem war, dass, wenn Sie die erste Tabelle verweisen, einige Datenbanken sind Groß- und Kleinschreibung über die Tabellennamen. Ich denke, das ist seltsam, da ich das nie gesehen, bevor sie auf MySQL, Oracle und jetzt das für mich auf MariaDB passiert ist.

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 Foreign Key (Id_Maquina) Referenzen CADASTRO_MAQUINAS (Id) );

Wenn ich versuche, die zweite Tabelle zu erstellen cadastro_maquinas (Kleinschreibung) statt CADASTRO_MAQUINAS verwenden, werde ich diesen Fehler erhalten.

Ich war mit MySQL workBench. Das Problem ist, Sie nicht die gleiche foreign key name verwenden können, müssen sie unique sein. Also, wenn mehr als eine Tabelle den gleichen Fremdschlüssel verweisen wird, jedes Mal, es muss ein unique Name gegeben werden.

Ich hatte einen ähnlichen Fehler auf einem meiner Tabellen. Wenn Spalte geprüft Sortierungs war unterschiedlich, was einmal beide Spalten auf den gleichen Sortierungstyp geändert gearbeitet.

Nachdem hier die meisten der vorgeschlagenen Lösung zu lesen. Ich dachte nur, könnte es hilfreich sein, wenn ich nur Liste nach unten alle die Möglichkeiten, die diesen Fehler werfen könnte.

1 ist, prüft Fall der Säule 2, überprüfen COLLATION der Spalten 3 Überprüfen Sie, ob ein Schlüssel dort in beiden Tabellen für die Spalte (Unique, Primary)

erstellt ist

In meinem Fall habe ich alte Tabellendefinition MyISAM in einen des Tisches und offensichtlich war ich nicht in der Lage Fremdschlüssel, um es von einem anderen Tisch zu machen. Vielleicht jemand helfen.

So dies wegen Unstimmigkeiten zwischen zwei Datenbanken passieren kann / Felder Definitionen versuchen zu überprüfen:

Field Type
Field Collation
Table Engine

Für mich war das Problem mit CONSTRAINT in der CREATE TABLE Abfrage verwenden.

Sie können auch die gleichen Fehler auftreten, wenn ein zusammengesetzten Schlüssel in Ihrem Fremdschlüssel zu verweisen versucht.

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, article_id und Typ-Feld in der gleichen Reihenfolge, in der FK-Definition zu verwenden, wie sie in der Artikel Tabelle PRIMARY KEY-Definition erscheinen.

In meinem Fall war wahrscheinlich ein Server Fehler eine Tabelle mit dem gleichen Namen fallen zu lassen. Dropping die ganze shcema und neu zu erstellen, es wurde das Problem behoben.

In sehr seltsamen Fällen Ihre Datenbank könnte gebrochen werden. In meinem Fall hatte ich keine Fremdschlüssel auf den Tisch und die einzige Umbenennung der Tabelle oder sich ändernde Motor geholfen.

aus innoDB Gedreht wurde gebrochen finden Sie unter: https://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted -Während-versucht-to-a? lq = 1

Wenn Sie auf MySQL Workbench arbeiten und Sie erhalten diese Fehler für eine Beziehungstabelle kann es für Sie eine schnelle Lösung sein: löschen Sie es einfach und lassen MySQL Workbench erstellen Sie es für Sie. Kopieren Sie dann die SQL. Feste mein errno 150 Problem.

Ich habe diesen Fehler bei dem Versuch, einen Fremdschlüssel zu verwenden, um ein nicht-eindeutiges Feld zu verweisen. (Die offenbar nicht erlaubt)

Als ich hatte dieses Problem war es, weil ich die ID in der ersten Tabelle gesetzt hatte seinen unsigned während des Fremdschlüssel in der zweiten Tabelle nicht. So dass sie fixiert beide unsigned es für mich.

Erstellen Sie immer Master / übergeordnete Tabellen zuerst, und dann erstellen Sie Ihr Detail / Kind-Tabellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top