MySQL: создание таблицы с ошибкой FK (errno 150)
Я создал модель с MySQL Workbench и сейчас пытаюсь установить ее на сервер MySQL.
Используя File > Export > Forward Engineer SQL CREATE Script... он выводит хороший большой файл для меня со всеми настройками, которые я запрашиваю. Я переключаюсь на MySQL GUI Tools (в частности, Query Browser) и загружаю этот скрипт (обратите внимание, что я собираюсь перейти от одного официального инструмента MySQL к другому). Тем не менее, когда я пытаюсь на самом деле выполнить этот файл, я получаю ту же ошибку снова и снова
SQLSTATE[HY000]: общая ошибка: 1005 Невозможно создать таблицу./srs_dev/location.frm (номер ошибки: 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 и нахожу все виды учетных записей, в которых говорится об ошибке в таблицах стилей InnoDB, которые не работают с внешними ключами, и исправление заключается в добавлении "SET FOREIGN_KEY_CHECKS=0;" к сценарию SQL. Ну, как вы можете видеть, это уже часть файла, который MySQL Workbench выплюнул.
Итак, мой вопрос: почему это не работает, когда я делаю то, что, как мне кажется, я должен делать?
Информация о версии:
MySQL: 5.0.45
- Инструменты GUI: 1.2.17
- Верстак: 5.0.30
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 диагностировать ошибку, но что произойдет, если вы исправите это несоответствие типов?
Для других, просматривающих эту ветку, существует множество причин, по которым вы можете получить эту ошибку:
См. Следующую ссылку для получения полного списка ошибок errno 150, errno 121 и других ошибок внешнего ключа MySQL:
Только что проверил ответ @juacala. Но не помог мне. Вот сообщение, которое я отправил @ELIACOM, когда нашел свой источник проблем:
Я читал этот замечательный источник решений, но моя проблема не решена. Я пытался добавить FK в таблицу INNODB, указывая на PK в MyISAM. После установки MyIsam на INNODB все заработало. Я проверил весь ваш список, прежде чем понял это. Приветствия.
У меня была такая же проблема. Каким-то образом я не заметил, чтобы установить auto_increment значение для идентификатора таблицы. Может быть, это кому-то поможет.