簡體   English   中英

MySQL:使用FK錯誤創建表(錯誤150)

[英]MySQL: Creating table with FK error (errno 150)

我用MySQL Workbench創建了一個模型,現在正嘗試將它安裝到mysql服務器上。

使用文件>導出>轉發工程師SQL CREATE腳本...它為我輸出一個很好的大文件,我要求的所有設置。 我切換到MySQL GUI Tools (專門用於查詢瀏覽器)並加載這個腳本(請注意,我將從另一個官方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

我得到了同樣的錯誤。 所以我開始谷歌這個問題,並找到所有類型的帳戶,談論與外鍵失敗的InnoDB樣式表的錯誤,並修復是添加“SET FOREIGN_KEY_CHECKS = 0;” 到SQL腳本。 好吧,正如您所看到的,這已經是MySQL Workbench吐出的文件的一部分。

所以,我的問題是,當我做我認為我應該做的事情時,為什么這不起作用?

版本信息:

  • MySQL:5.0.45

  • GUI工具: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 ,

因此,您嘗試使用表location TINYINT字段來引用INT字段(在表statebrand )。 我認為這是它抱怨的錯誤。 不確定它是如何出現的,或者為什么歸零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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM