Вопрос

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

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

SQLSTATE[HY000]:Общая ошибка:1005 не может создать таблицу './srs_dev/location.frm' (errno:150)

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

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@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 в Google и нахожу все виды учетных записей, в которых говорится об ошибке с таблицами стиля Innodb, которые терпят неудачу с иностранными ключами, и исправление состоит в том, чтобы добавить «set foreign_key_checks = 0;» к сценарию SQL.Ну, как вы можете видеть, это уже часть файла, который MySQL Workbench выплюнул.

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

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

  • MySQL:5.0.45

  • Инструменты графического интерфейса:1.2.17
  • Верстак:5.0.30
Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top