2013-01-12 73 views
5

我有以下表格:SQL:錯誤1005:無法創建表「obl2.itemsubjects」(錯誤:121)

CREATE TABLE `OBL2`.`item` (
`itemID` INT NOT NULL AUTO_INCREMENT , 
`itemName` VARCHAR(45) NOT NULL , 
PRIMARY KEY (`itemID`) , 
INDEX `itemName` (`itemName` ASC)); 

CREATE TABLE `OBL2`.`subject` (
`subjectID` INT NOT NULL , 
`subjectName` VARCHAR(45) NOT NULL , 
PRIMARY KEY (`subjectID`)); 

現在,因爲該連接是多對多的,每個項目可以有很多主題和每個主題都可以與許多項目相關 - 我想設置一個連接表。 這是我的代碼:

CREATE TABLE `OBL2`.`itemsubjects` (
`itemID` INT NOT NULL , 
`subjectID` INT NOT NULL , 
PRIMARY KEY (`itemID`, `subjectID`) , 
INDEX `itemID_idx` (`itemID` ASC) , 
INDEX `subjectID_idx` (`subjectID` ASC) , 
CONSTRAINT `itemID` 
FOREIGN KEY (`itemID`) 
REFERENCES `OBL2`.`item` (`itemID`) 
ON DELETE CASCADE 
ON UPDATE CASCADE, 
CONSTRAINT `subjectID` 
FOREIGN KEY (`subjectID`) 
REFERENCES `OBL2`.`subject` (`subjectID`) 
ON DELETE CASCADE 
ON UPDATE CASCADE); 

但由於某種原因,第3臺的代碼不被接受。 我得到一個錯誤信息:

錯誤1005:無法創建表「obl2.itemsubjects」(錯誤:121)

我在互聯網上閱讀有關該錯誤的,它說這是一個已知的MYSQL問題,但沒有解決方案。

有什麼想法?

+0

你可以嘗試一些數據插入到前兩個表中的腳本,然後添加創建表的第三個表? – bonCodigo

+0

嘿bonCondigo,我現在試過..還是一樣的錯誤。我不得不說,我早些時候和作者一樣做了同樣的事情,它完美地工作。我可以弄清楚爲什麼它會失敗。 –

+0

是否必須爲db指定明確的表名? – bonCodigo

回答

3

MySQL的文檔說在FOREIGN KEY Constraints(重點煤礦):

如果CONSTRAINT符號條款已定,那麼符號值必須唯一數據庫。如果沒有給出該子句,InnoDB會自動創建該名稱。

所以,究其原因是,itemsubject表創建失敗,是你有另外的(外鍵)約束,命名爲itemID,或者一個數據庫中的其它表命名subjectID

在數據庫中有一個標準的命名策略是很好的。正如你ColumnName_idx的指數,你可以使用ReferencedTable_ReferencingTable_FK外鍵約束:

CREATE TABLE OBL2.itemsubjects (
    itemID INT NOT NULL , 
    subjectID INT NOT NULL , 
    PRIMARY KEY 
    (itemID, subjectID) , 
    INDEX itemID_idx       -- I like these 
    (itemID ASC) , 
    INDEX subjectID_idx      -- two 
    (subjectID ASC) , 
    CONSTRAINT item_itemsubject_FK    -- what I propose, here 
    FOREIGN KEY (itemID) 
    REFERENCES OBL2.item (itemID) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE, 
    CONSTRAINT subject_itemsubject_FK   -- and here 
    FOREIGN KEY (subjectID) 
    REFERENCES OBL2.subject (subjectID) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE 
); 
相關問題