2013-02-21 104 views
2

我在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

回答

1

更改授予表中的外鍵約束。

參考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

0

解決:

在出口菜單中,選擇「生成單獨的CREATE INDEX語句」選項,以避免此錯誤。