2011-08-25 112 views
6

真的很討厭使用其他人的時間,但看起來問題不在於消失。不能創建表(errno:150)InnoDB添加外鍵約束

我認爲所有建議http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/http://forums.mysql.com/read.php?22,19755,19755#msg-19755但沒有。

希望有人指出一個愚蠢的錯誤。

這裏的表:

CREATE TABLE IF NOT EXISTS `shop`.`category` (
    `id` INT(11) NOT NULL AUTO_INCREMENT , 
    `category_id` INT(11) NOT NULL , 
    `parent_id` INT(11) NULL DEFAULT '0' , 
    `lang_id` INT(11) NOT NULL , 
    ...other columns... 
    PRIMARY KEY (`id`, `category_id`)) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_unicode_ci; 



CREATE TABLE IF NOT EXISTS `shop`.`product_category` (
    `category_id` INT(11) NOT NULL , 
    `product_id` INT(11) NOT NULL , 
    INDEX `fk_product_category_category1_zxc` (`category_id` ASC) , 
    CONSTRAINT `fk_product_category_category1_zxc` 
    FOREIGN KEY (`category_id`) 
    REFERENCES `shop`.`category` (`category_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_unicode_ci; 

錯誤代碼:1005無法創建表 'shop.product_category'(錯誤:150)

回答

9

你需要CATEGORY_ID指數在分類表(我發現它是主鍵的一部分,但是因爲它是索引中的第二列,所以不能使用它)。您在外鍵中引用的字段應始終編入索引。

+0

謝謝!這解決了問題! –

+0

如果這解決了問題,那麼請將答案標記爲已接受! – ddinchev

+0

對不起,我該怎麼做? –

1

在我的情況下,這個問題更像是您鏈接到的第一篇文章中描述的內容。

所以我必須確保:

  • Referenced Column是索引,
  • Referencing ColumnReferenced Column共享相同的類型和長度,即,例如兩者都是INT(10)
  • 二者共享相同不爲空無符號ZEROFILL等配置。
  • 這兩個表都是InnoDB

這裏是查詢模板,其中Referencing Columnreferencing_idReferenced Columnreferenced_id

ALTER TABLE `db`.`referencing` 
ADD CONSTRAINT `my_fk_idx` 
FOREIGN KEY (`referencing_id`) 
REFERENCES `db`.`referenced`(`referenced_id`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION; 

更新2016年3月13日:就遇到了這個問題又來了,最終找到我自己的答案。雖然這次沒有幫助。原來另一個表仍然設置爲MyISAM,只要我將其更改爲InnoDB一切正常。