MySQL的:与FK错误创建表(错误150)(MySQL: Creating table with

2019-07-29 16:08发布

我已经创建了一个模型, MySQL工作台 ,我现在试图将其安装到一个MySQL服务器。

使用文件>导出>转发工程师SQL创建脚本...它输出给我一个漂亮的大文件,与我要求的所有设置。 我切换到MySQL的GUI工具 (查询浏览器专门)和加载此脚本(请注意,我会形成一个正式的MySQL工具到另一个)。 然而,当我尝试实际执行这个文件,我一遍又一遍地得到同样的错误

SQLSTATE [HY000]:常规错误:1005无法创建表 './srs_dev/location.frm'(错误:150)

“OK”,我对自己说,什么是错的与位置表。 所以,我检查了输出文件的定义。

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

我也得到了同样的错误。 于是,我开始谷歌这个问题,并发现,谈论与InnoDB的样式表未能与外键错误各种账户,而解决方法是添加“SET FOREIGN_KEY_CHECKS = 0;” 在SQL脚本。 好了,你可以看到,这已经是MySQL工作台吐出文件的一部分。

所以,我的问题是,那么,为什么当我在做什么,我想我应该做这个工作不?

版本信息:

  • MySQL的:5.0.45

  • GUI工具:1.2.17
  • 工作台:5.0.30

Answer 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字段(表statebrand )与TINYINT在表中的字段location 。 我认为这是它的抱怨错误。 不知道它在首位怎么来了,或者为什么清零FOREIGN_KEY_CHECKS不会从诊断错误停止MySQL,但是如果你解决这个类型不匹配,会发生什么?



Answer 2:

对于其他人在看这个线程,也有原因,你可以得到这个错误颇多:

请参见以下链接的完整列表,错误号150,错误号121和其他MySQL外键的错误:

MySQL的外键错误,并将errno 150



Answer 3:

刚才检查@juacala的答案。 但是,我没有帮助。 下面是我送@ELIACOM当我发现我的麻烦来源的信息:

我读这个伟大的解决方案的来源,但我的问题是不是不客气。 我试图在InnoDB表指向一个MyISAM添加FK的PK。 设置了MyISAM InnoDB的后它的工作。 我意识到之前检查你的整个列表。 干杯。



Answer 4:

我有同样的问题。 不知怎的,我没有注意到,以AUTO_INCREMENT值设置为表ID。 也许这可以帮助别人。



文章来源: MySQL: Creating table with FK error (errno 150)