2009-07-05 7 views
18

Ich habe ein Modell mit MySQL Workbench erstellt und versuche jetzt, es auf einem MySQL-Server zu installieren.MySQL: Erstellen von Tabelle mit FK Fehler (errno 150)

Verwendung Datei> Exportieren> Forward Engineer SQL CREATE Skript ... es gibt eine schöne große Datei für mich, mit allen Einstellungen, die ich fragen. Ich wechsle zu MySQL GUI Tools (der Abfrage-Browser spezifisch) und lade dieses Skript (beachte, dass ich von einem offiziellen MySQL-Tool zu einem anderen gehe). Allerdings, wenn ich versuche, um tatsächlich diese Datei ausführen, ich den gleichen Fehler immer und immer

SQLSTATE[HY000]: General error: 1005 Can't create table './srs_dev/location.frm' (errno: 150)

„OK“ erhalten, sage ich mir, etwas mit der Ortstabelle ist falsch. Also schaue ich mir die Definition in der Ausgabedatei an.

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

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

Und ich bekomme den gleichen Fehler. Also beginne ich dieses Problem zu googeln und finde alle Arten von Konten, die über einen Fehler mit InnoDB-Stiltabellen sprechen, die mit Fremdschlüsseln fehlschlagen, und der Fix besteht darin, "SET FOREIGN_KEY_CHECKS = 0;" zum SQL-Skript. Wie Sie sehen können, ist dies bereits Teil der Datei, die MySQL Workbench ausgespuckt hat.

Also meine Frage ist dann, warum funktioniert das nicht, wenn ich mache, was ich denke, dass ich tun soll?

Version Info:

  • MySQL: 5.0.45

  • GUI Tools: 1.2.17
  • Workbench: 5.0.30
+1

Obwohl dies nicht der Fall in Ihrem SQL ist, wird derselbe Fehler auch dadurch verursacht, dass keine eindeutigen Fremdschlüsselnamen zwischen Tabellen vorhanden sind. –

Antwort

40

Die Art des Feldes in einem Der Fremdschlüssel muss dem Typ der Spalte entsprechen, auf die verwiesen wird. 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 versucht man location zu INT Felder (in Tabellen state und brand) mit TINYINT Felder in der Tabelle zu verweisen. Ich denke, das ist der Fehler, über den es sich beschwert. Ich bin mir nicht sicher, wie es überhaupt zustande kam, oder warum das Beenden von FOREIGN_KEY_CHECKS MySQL nicht daran hindert, den Fehler zu diagnostizieren, aber was passiert, wenn Sie diesen Typ nicht einhalten?

+2

OK, ähm ... haha. Wow, das ist peinlich. Ich war so beschäftigt, nach etwas zu suchen, das mit der tatsächlichen Beziehung falsch war, dass ich die Spalten selbst nicht überprüft habe. Danke für das 2. Augenpaar! –

+3

Wow! Es passierte auch beim Mischen von "INT" und "INT UNSIGNED". Ja, das war meine Schuld; aber MySQL Workbench benötigt eine Warnung dazu! – Mauro

+1

Vielen Dank !!!! Ich musste UNSIGNED einfach allen INT-Fremdschlüsseln hinzufügen. –

9

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

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

MySQL Foreign Key Errors and Errno 150

+1

Ja, danke! Übrigens, liebe den Comic von xkcd. Ich kann mich sehr gut darauf beziehen! Prost. – SecondSun24

+1

Das war die Antwort, die ich brauchte. Mein Problem war MyISAM anstelle von InnoDB. – Ryan

-2

Ich hatte das gleiche Problem. Irgendwie habe ich nicht bemerkt, den Wert auto_increment auf die Tabellen-ID zu setzen. Vielleicht hilft es jemandem.

+5

'AUTO_INCREMENT' oder nicht, hat keine Auswirkung auf die Gültigkeit des Fremdschlüssels. –

0

gerade @juacala Antwort gecheckt. Aber hat mir nicht geholfen. Hier ist die Nachricht, die ich @ELIACOM gesendet habe, als ich meine Problemquelle gefunden habe.:

+0

Das ist drin, aber für einige Versionen schlägt der Fremdschlüssel-Zusatz stillschweigend fehl. Es ist # 2 in der Liste unter "andere Fremdschlüsselfehler" – juacala

Verwandte Themen