我创建了一个模型 MySQL工作台 现在我正在尝试将其安装到 mysql 服务器。

使用 文件 > 导出 > 正向工程 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

我得到同样的错误。因此,我开始搜索此问题,并找到各种帐户,这些帐户与InnoDB样式表有关的错误表,而Erought Keys失败了,修复程序是添加“ SET forefer_key_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 字段(在表中 statebrand) 和 TINYINT 表中的字段 location. 。我认为这就是它所抱怨的错误。不知道它最初是如何出现的,或者为什么要归零 FOREIGN_KEY_CHECKS 不会阻止 MySQL 诊断错误,但是如果修复这种类型不匹配会发生什么?

其他提示

对于查看此线程的其他人来说,出现此错误的原因有很多:

有关 errno 150、errno 121 和其他 MySQL 外键错误的完整列表,请参阅以下链接:

MySQL 外键错误和 Errno 150

刚刚检查了@juacala 的答案。但没有帮助我。这是当我发现问题根源时我发送给@ELIACOM 的消息:

我正在阅读这种重要的解决方案的来源,但我的问题并不是什么。我试图在一个InnoDB桌上添加一个FK,指向Myisam中的PK。将 MyIsam 设置为 INNODB 后,它就起作用了。在意识到这一点之前,我检查了您的整个列表。干杯。

我有同样的问题。不知何故,我没有注意到将 auto_increment 值设置为表 id。也许它对某人有帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top