it-swarm.com.ru

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

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

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

SQLSTATE [HY000]: общая ошибка: 1005 Не могу создать таблицу './srs_dev/location.frm' (номер ошибки: 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. Ну, как вы можете видеть, это уже часть файла, который MySQL Workbench выплюнул.

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

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

  • MySQL: 5.0.45

  • Инструменты GUI: 1.2.17
  • Верстак: 5.0.30
18
Peter Bailey

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

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

40
Alex Martelli

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

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

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

9
juacala

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

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

0
juanmf