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
Obwohl dies nicht der Fall in Ihrem SQL ist, wird derselbe Fehler auch dadurch verursacht, dass keine eindeutigen Fremdschlüsselnamen zwischen Tabellen vorhanden sind. –