MySQL工作台 - 正向工程 - 错误1005:无法创建表(错误:150)

问题描述:

我在MacOSX上使用MySQL Workbench 5.2.45我设计了一个使用EER Diagram功能的数据库,然后尝试正向工程来生成我的数据库放在我的本地服务器上。我得到的错误代码:错误1005:无法创建表(错误:150)MySQL工作台 - 正向工程 - 错误1005:无法创建表(错误:150)

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; 

CREATE SCHEMA IF NOT EXISTS `Finance` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ; 
USE `Finance` ; 

-- ----------------------------------------------------- 
-- Table `Finance`.`DatabaseUser` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `Finance`.`DatabaseUser` (
    `ID` INT(11) NOT NULL AUTO_INCREMENT , 
    `FirstName` VARCHAR(255) NOT NULL , 
    `LastName` VARCHAR(255) NOT NULL , 
    `Tel` VARCHAR(255) NULL , 
    `Email` VARCHAR(255) NOT NULL, 
    `Password` VARCHAR(255) NOT NULL , 
    `Admin` CHAR(1) NOT NULL DEFAULT 'N' , 
    `Project1` CHAR(1) NOT NULL DEFAULT 'N' , 
    `Project2` CHAR(1) NOT NULL DEFAULT 'N' , 
    `Project3` CHAR(1) NOT NULL DEFAULT 'N' , 
    PRIMARY KEY (`ID`)) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `Finance`.`Entities` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `Finance`.`Entities` (
    `ID` INT(11) NOT NULL AUTO_INCREMENT , 
    `CreatorID` INT(11) NOT NULL , 
    `FullName` VARCHAR(255) NOT NULL , 
    `ShortName` VARCHAR(255) NULL , 
    PRIMARY KEY (`ID`) , 
    INDEX `Creator_idx` (`CreatorID` ASC) , 
    CONSTRAINT `CreatorEntities` 
    FOREIGN KEY (`CreatorID`) 
    REFERENCES `Finance`.`DatabaseUser` (`ID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

-- ----------------------------------------------------- 
-- Table `Finance`.`Grant` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `Finance`.`Grant` (
    `ID` INT(11) NOT NULL AUTO_INCREMENT , 
    `CreatorID` INT(11) NOT NULL , 
    `DonorID` INT(11) NOT NULL , 
    `RecipientID` INT(11) NOT NULL , 
    `Name` VARCHAR(255) NOT NULL , 
    `Year` YEAR NOT NULL , 
    PRIMARY KEY (`ID`) , 
    INDEX `Creator_idx` (`CreatorID` ASC) , 
    INDEX `index3` (`DonorID` ASC, `RecipientID` ASC) , 
    CONSTRAINT `CreatorGrant` 
    FOREIGN KEY (`CreatorID`) 
    REFERENCES `Finance`.`DatabaseUser` (`ID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `InstrumentGrant` 
    FOREIGN KEY (`DonorID` , `RecipientID`) 
    REFERENCES `Finance`.`Entities` (`ID` , `ID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

USE `Finance` ; 


SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

我一直试图在后(Error Code: 1005. Can't create table '...' (errno: 150))提出的解决方案,但似乎并没有成为问题。 1.数据类型是相同的 2.我引用主键 3.外键的名称是唯一 4.表是所有的InnoDB 5.无SET NULL参与 等

能否请你帮?

+0

哪些FK约束失败?和'显示引擎innodb状态'将会倾倒出大量的数据,埋在它的中间是“最后的外键错误”。它会有更多关于你为什么获得1005/150的细节。 – 2013-02-21 22:09:13

+0

对不起,忘了提及这个'错误:错误1005:无法创建表'Finance.Grant'(errno:150)' – FinanceGardener 2013-02-21 22:11:29

+0

并查看语法,授予表的InstrumentGrant FK中的'(ID,ID)'位看起来很时髦。不知道你可以像这样两次FK到同一场。 – 2013-02-21 22:15:54

更改授予表中的外键约束。

参考http://www.sqlfiddle.com/#!2/04945

CONSTRAINT `InstrumentGrant` 
    FOREIGN KEY (`RecipientID`) 
    REFERENCES `Entities` (`ID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `InstrumentGrant_2` 
    FOREIGN KEY (`DonorID`) 
    REFERENCES `Entities` (`ID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION 

名称为你想要的约束。

+0

@MarcB和Slowcoder非常感谢,解决了我的问题!在单个约束中没有FK到同一个字段两次。 – FinanceGardener 2013-02-21 22:32:50

解决:

在出口菜单中,选择“生成单独的CREATE INDEX语句”选项,以避免此错误。