MySQL: создание таблицы с ошибкой FK (errno 150)

Я создал модель сMySQL Workbench и сейчас пытаюсь установить его на сервер MySQL.

С помощьюFile > Export > Forward Engineer SQL CREATE Script... он выводит хороший большой файл для меня со всеми настройками, которые я запрашиваю. Я переключаюсь наMySQL GUI Tools (в частности, браузер запросов) и загрузите этот скрипт (обратите внимание, что я собираюсь сформировать один официальный инструмент MySQL для другого). Тем не менее, когда я пытаюсь на самом деле выполнить этот файл, я получаю ту же ошибку снова и снова

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

"ОК", говорю себе, что-то не так с таблицей местоположений. Поэтому я проверяю определение в выходном файле.

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

Выглядит нормально для меня. Я предполагаю, что, возможно, что-то не так с браузером запросов, поэтому я помещаю этот файл на сервер и пытаюсь загрузить его таким образом

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

И я получаю ту же ошибку. Поэтому я начинаю поискать эту проблему в Google и нахожу все виды учетных записей, в которых говорится об ошибке в таблицах стилей InnoDB, которые не работают с внешними ключами, и исправление заключается в добавлении & quot; SET FOREIGN_KEY_CHECKS = 0; & quot; к сценарию SQL. Ну, как вы можете видеть, это уже часть файла, который MySQL Workbench выплюнул.

Итак, мой вопрос заключается в том, почему это не работает, когда я делаю то, что, как мне кажется, я должен делать?

Информация о версии:

MySQL: 5.0.45 GUI Tools: 1.2.17 Workbench: 5.0.30
 user69842608 апр. 2011 г., 12:01
Хотя это не так в вашем SQL, та же ошибка также вызвана отсутствием уникальных имен внешних ключей между таблицами.

Ответы на вопрос(4)

Решение Вопроса

Тип поля во внешнем ключе должен совпадать с типом столбца, на который они ссылаются. У вас есть следующее (отрывание):

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 ,

поэтому вы пытаетесь сослаться наINT поля (в таблицахstate а такжеbrand) сTINYINT поля в таблицеlocation, Я думаю, что это ошибка, на которую она жалуется. Не уверен, как это получилось в первую очередь, или почему обнулениеFOREIGN_KEY_CHECKS не останавливает MySQL от диагностики ошибки, но что произойдет, если вы исправите это несоответствие типов?

 25 мая 2016 г., 15:17
Огромное спасибо!!!! Я просто должен был добавить UNSIGNED ко всем внешним ключам INT.
 31 мая 2012 г., 01:41
Вот Это Да! Это также происходило при микшировании & quot; INT & quot; и & quot; INT UNSIGNED & quot ;. Да, это была моя вина; но MySQL Workbench требует предупреждения об этом!
 Peter Bailey06 июл. 2009 г., 06:41
Хорошо, хм ... хаха. Вау, это стыдно. Я был так занят поиском чего-то не так с фактическими отношениями, что не проверял сами столбцы. Спасибо за 2-ую пару глаз на это!

только что проверил ответ @juacala. Но это не помогло мне. Вот сообщение, которое я отправил @ELIACOM, когда нашел свой источник проблем:

I was reading this great source of solutions, but my issue is not adressed. I was trying to add an FK in a INNODB table pointing to a PK in a MyISAM. After setting the MyIsam to INNODB it worked. I checked your whole list before realizing that. Cheers.

 13 апр. 2015 г., 19:38
Это там, но для некоторых версий добавление внешнего ключа молча завершается неудачей. Он # 2 в списке под заголовком «Другие ошибки внешнего ключа».

Для других, просматривающих эту тему, есть много причин, по которым вы можете получить эту ошибку:

См. Следующую ссылку для получения полного списка ошибок errno 150, errno 121 и других ошибок внешнего ключа MySQL:

Ошибки внешнего ключа MySQL и Errno 150

 12 сент. 2012 г., 00:28
Да, спасибо! Кстати, люблю комикс XKCD. Я могу относиться с большим размахом! Приветствия.
 12 апр. 2015 г., 01:57
Это был ответ, который мне был нужен. Моя проблема была MyISAM вместо InnoDB.

У меня была такая же проблема. Каким-то образом я не заметил установки значения auto_increment для идентификатора таблицы. Может быть, это кому-то помогает.

 17 июл. 2012 г., 19:37
AUTO_INCREMENT или нет, не влияет на действительность внешнего ключа.

Ваш ответ на вопрос