it-swarm.com.de

MySQL: Erstellen einer Tabelle mit FK-Fehler (Fehlernummer 150)

Ich habe ein Modell mit MySQL Workbench erstellt und versuche jetzt, es auf einem MySQL-Server zu installieren.

Mit File> Export> Forward Engineer SQL CREATE Script ... wird eine schöne große Datei mit allen Einstellungen ausgegeben, die ich frage. Ich wechsle zu MySQL GUI Tools (speziell zum Abfrage-Browser) und lade dieses Skript (beachten Sie, dass ich von einem offiziellen MySQL-Tool zu einem anderen wechseln werde). Wenn ich jedoch versuche, diese Datei tatsächlich auszuführen, erhalte ich immer wieder den gleichen Fehler 

SQLSTATE [HY000]: Allgemeiner Fehler: 1005 Tabelle './Srs_dev/location.frm' (Fehlernummer: 150) kann nicht erstellt werden.

"OK", sage ich mir, mit der Location-Tabelle stimmt etwas nicht. Also checke ich die Definition in der Ausgabedatei aus.

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';

-- -----------------------------------------------------
-- Table `state`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `state` ;

CREATE  TABLE IF NOT EXISTS `state` (
  `state_id` INT NOT NULL AUTO_INCREMENT ,
  `iso_3166_2_code` VARCHAR(2) NOT NULL ,
  `name` VARCHAR(60) NOT NULL ,
  PRIMARY KEY (`state_id`) )
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `brand`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `brand` ;

CREATE  TABLE IF NOT EXISTS `brand` (
  `brand_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(45) NOT NULL ,
  `domain` VARCHAR(45) NOT NULL ,
  `manager_name` VARCHAR(100) NULL ,
  `manager_email` VARCHAR(255) NULL ,
  PRIMARY KEY (`brand_id`) )
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `location`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `location` ;

CREATE  TABLE IF NOT EXISTS `location` (
  `location_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(255) NOT NULL ,
  `address_line_1` VARCHAR(255) NULL ,
  `address_line_2` VARCHAR(255) NULL ,
  `city` VARCHAR(100) NULL ,
  `state_id` TINYINT UNSIGNED NULL DEFAULT NULL ,
  `postal_code` VARCHAR(10) NULL ,
  `phone_number` VARCHAR(20) NULL ,
  `fax_number` VARCHAR(20) NULL ,
  `lat` DECIMAL(9,6) NOT NULL ,
  `lng` DECIMAL(9,6) NOT NULL ,
  `contact_url` VARCHAR(255) NULL ,
  `brand_id` TINYINT UNSIGNED NOT NULL ,
  `summer_hours` VARCHAR(255) NULL ,
  `winter_hours` VARCHAR(255) NULL ,
  `after_hours_emergency` VARCHAR(255) NULL ,
  `image_file_name` VARCHAR(100) NULL ,
  `manager_name` VARCHAR(100) NULL ,
  `manager_email` VARCHAR(255) NULL ,
  `created_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
  PRIMARY KEY (`location_id`) ,
  CONSTRAINT `fk_location_state`
    FOREIGN KEY (`state_id` )
    REFERENCES `state` (`state_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_location_brand`
    FOREIGN KEY (`brand_id` )
    REFERENCES `brand` (`brand_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

CREATE INDEX `fk_location_state` ON `location` (`state_id` ASC) ;

CREATE INDEX `fk_location_brand` ON `location` (`brand_id` ASC) ;

CREATE INDEX `idx_lat` ON `location` (`lat` ASC) ;

CREATE INDEX `idx_lng` ON `location` (`lng` ASC) ;

Sieht für mich ok aus. Ich vermute, dass mit dem Abfrage-Browser möglicherweise etwas nicht stimmt, also lege ich diese Datei auf den Server und versuche, sie auf diese Weise zu laden

] mysql -u admin -p -D dbname < path/to/create_file.sql

Und ich bekomme den gleichen Fehler. Ich beginne dieses Problem mit Google und finde alle Arten von Konten, die über einen Fehler mit InnoDB-Style-Tabellen sprechen, die mit Fremdschlüsseln fehlschlagen, und das Update besteht darin, "SET FOREIGN_KEY_CHECKS = 0;" zum SQL-Skript. Wie Sie sehen, ist dies bereits Teil der Datei, die MySQL Workbench ausgespuckt hat.

Meine Frage ist also, warum funktioniert das nicht, wenn ich das mache, was ich denke, was ich tun soll?

Versions Information:

  • MySQL: 5.0.45

  • GUI-Tools: 1.2.17
  • Werkbank: 5.0.30
18
Peter Bailey

Der Typ des Felds in einem Fremdschlüssel muss mit dem Typ der Spalte übereinstimmen, auf die verwiesen wird. Sie haben folgendes (Schnippen):

CREATE  TABLE IF NOT EXISTS `state` (
  `state_id` INT NOT NULL AUTO_INCREMENT ,
...
CREATE  TABLE IF NOT EXISTS `brand` (
  `brand_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
...
CREATE  TABLE IF NOT EXISTS `location` (
...
  `state_id` TINYINT UNSIGNED NULL DEFAULT NULL ,
...
  `brand_id` TINYINT UNSIGNED NOT NULL ,

sie versuchen also, auf INT-Felder (in den Tabellen state und brand) mit TINYINT-Feldern in der Tabelle location zu verweisen. Ich denke, das ist der Fehler, über den er sich beschwert. Sie sind sich nicht sicher, wie sie überhaupt entstanden sind oder warum FOREIGN_KEY_CHECKS durch Nullabgleich nicht dazu geführt wird, dass MySQL den Fehler diagnostiziert. Was passiert jedoch, wenn Sie dieses Typenkonflikt beheben?

40
Alex Martelli

Für andere, die diesen Thread betrachten, gibt es viele Gründe, warum Sie diesen Fehler erhalten können:

Unter folgendem Link finden Sie eine vollständige Liste für errno 150, errno 121 und andere MySQL-Fremdschlüsselfehler:

MySQL-Fremdschlüsselfehler und Errno 150

9
juacala

habe gerade @juacalas Antwort überprüft. Hat mir aber nicht geholfen. Hier ist die Nachricht, die ich an @ELIACOM geschickt habe, als ich meine Ursache gefunden habe:

Ich habe diese großartige Lösungsquelle gelesen, aber meine Frage ist nicht an Gerichtet. Ich habe versucht, eine FK in eine INNODB-Tabelle einzufügen, die auf eine PK in einer MyISAM verweist. Nachdem Sie den MyIsam auf INNODB gesetzt haben, hat es funktioniert. Ich Habe Ihre ganze Liste geprüft, bevor ich das begriff. Prost.

0
juanmf