Frage

Ich habe ein Modell mit MySQL Workbench erstellt und jetzt ist versucht, es zu einem MySQL-Installation Server.

Mit Datei> Exportieren> Weiterleiten SQL-Ingenieure Skript ... es gibt eine schöne große Datei für mich, mit allen Einstellungen, frage ich. Ich Umschaltung auf MySQL GUI Tools (Query Browser speziell) und Last up dieses Skript (beachten Sie, dass ich Form eines offiziellen MySQL-Tool zum anderen werde). Allerdings, wenn ich versuche, um tatsächlich diese Datei ausführen, bekomme ich die gleichen Fehler immer und immer wieder

  

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

„OK“, sage ich mir, ist etwas falsch mit der Ortstabelle. Also habe ich die Definition in der Ausgabedatei überprüfen.

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

-- -----------------------------------------------------
-- 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. Ich vermute, dass vielleicht ist etwas falsch mit dem Query Browser, so dass ich diese Datei auf dem Server und versuche, es auf diese Weise zu laden

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

Und ich bekomme den gleichen Fehler. Also fange ich an dieses Problem an Google und alle Arten von Konten finden, die über einen Fehler mit InnoDB-Stil Tabellen sprechen, die mit Fremdschlüssel fehlschlagen, und das Update ist hinzuzufügen „SET FOREIGN_KEY_CHECKS = 0;“ auf dem SQL-Skript. Nun, wie Sie sehen können, das ist schon ein Teil der Datei, die MySQL Workbench ausgespuckt.

Also, meine Frage ist dann, warum dies nicht funktioniert, wenn ich tue, was ich denke, ich soll tun?

Version Info:

  • MySQL: 5.0.45

  • GUI Tools: 1.2.17
  • Workbench: 5.0.30
War es hilfreich?

Lösung

Der Typ des Feldes in einem Fremdschlüssel muss das gleiche wie der Typ der Spalte ist sie verweisen. Sie haben die folgende (snipping):

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 ,

so Sie versuchen, Felder beziehen sich auf INT (in Tabellen state und brand) mit TINYINT Felder in der Tabelle location. Ich denke, das ist der Fehler, der es über beschwert. Nicht sicher, wie es kam, in erster Linie, oder warum FOREIGN_KEY_CHECKS eliminiert nicht MySQL stoppt die Fehler diagnostizieren, aber was passiert, wenn Sie diese Art Mismatch beheben?

Andere Tipps

Für andere auf diesen Thread suchen, gibt es eine Menge Gründe, dass Sie diesen Fehler erhalten können:

Sehen Sie den folgenden Link für eine vollständige Liste für errno 150, Fehlernummer 121 und andere MySQL Fremdschlüsselfehler:

MySQL Fremdschlüssel Fehler und Errno 150

habe gerade überprüft @juacala ‚s Antwort. Aber hat mir nicht geholfen. Hier ist die Botschaft, die ich @ELIACOM gesendet, wenn ich meine Fehlerquelle gefunden.

  

Ich habe diese große Quelle von Lösungen zu lesen, aber mein Problem ist nicht   gerichtet. Ich habe versucht, ein FK in einer InnoDB-Tabelle zeigt auf ein hinzufügen   PK in einer MyISAM. Nach dem Einstellen der MyIsam es in InnoDB gearbeitet. ich   überprüft Ihre ganze Liste vor, dass zu realisieren. Prost.

Ich hatte dasselbe Problem. Irgendwie habe ich nicht bemerkt auto_increment Wert auf den Tisch ID einzustellen. Vielleicht hilft es jemand.

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