Stworzyłem model z MySQL Workbench i teraz próbuję zainstalować go na serwerze mysql.MySQL: Tworzenie tabeli z błędem FK (errno 150)
Korzystanie z Plik> Eksportuj> Przekaż inżynier SQL CREATE Script ... Wydaje dla mnie ładny, duży plik, ze wszystkimi ustawieniami, o które pytam. Przełączam się na MySQL GUI Tools (w szczególności przeglądarkę zapytań) i ładuję ten skrypt (zauważ, że przechodzę z jednego oficjalnego narzędzia MySQL na inny). Jednak, gdy próbuję faktycznie wykonać ten plik, pojawia się ten sam błąd w kółko
SQLSTATE[HY000]: General error: 1005 Can't create table './srs_dev/location.frm' (errno: 150)
„OK”, mówię sobie, że coś jest nie tak z tabeli lokalizacji. Więc sprawdzam definicję w pliku wyjściowym.
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) ;
Wygląda dobrze. Przypuszczam, że może coś jest nie tak z Query Browser, więc mogę umieścić ten plik na serwerze i spróbuj załadować go w ten sposób
] mysql -u admin -p -D dbname < path/to/create_file.sql
I uzyskać ten sam błąd. Tak więc zaczynam od Google'a ten problem i znajduję wszystkie rodzaje kont, które mówią o błędzie w tabelach w stylu InnoDB, które zawiodły w przypadku kluczy obcych, a poprawka polega na dodaniu "SET FOREIGN_KEY_CHECKS = 0;" do skryptu SQL. Jak widać, jest to już część pliku, który MySQL Workbench wypluł.
Moje pytanie brzmi: dlaczego to nie działa, kiedy robię to, co myślę, że powinienem robić?
Version Info:
MySQL: 5.0.45
- GUI Tools: 1.2.17
- Workbench: 5.0.30
Chociaż nie jest tak w przypadku SQL, ten sam błąd jest również spowodowany brakiem unikalnych nazw kluczy obcych między tabelami. –