Подтвердить что ты не робот

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

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

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

SQLSTATE [HY000]: Общая ошибка: 1005 Невозможно создать таблицу './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, которые не работают с внешними ключами, и исправление заключается в добавлении "SET FOREIGN_KEY_CHECKS = 0;" к SQL Script. Ну, как вы видите, это уже часть файла, который выложил MySQL Workbench.

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

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

  • MySQL: 5.0.45

  • Инструменты GUI: 1.2.17
  • Workbench: 5.0.30
4b9b3361

Ответ 1

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

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 диагностировать ошибку, но что произойдет, если вы устраните несоответствие этого типа?

Ответ 2

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

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

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

Ответ 3

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

Я читал этот отличный источник решений, но моя проблема не адресован. Я пытался добавить FK в таблицу INNODB, указывающую на ПК в MyISAM. После установки MyIsam на INNODB это сработало. я проверил весь ваш список, прежде чем осознать это. Приветствия.

Ответ 4

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