MySQL:Создание таблицы с ошибкой FK (ошибка 150)
-
23-08-2019 - |
Вопрос
Я создал модель с 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 см. по следующей ссылке:
только что проверил ответ @juacala.Но мне не помогло.Вот сообщение, которое я отправил @ELIACOM, когда обнаружил источник проблемы:
Я читал этот великий источник решений, но моя проблема не распределена.Я пытался добавить FK в таблицу Innodb, указывающую на PK в Myisam.После установки MyIsam в INNODB все заработало.Я проверил весь ваш список, прежде чем понять это.Ваше здоровье.
У меня была такая же проблема.Почему-то я не заметил, чтобы значение auto_increment соответствовало идентификатору таблицы.Возможно, это кому-то поможет.