无法创建表(错误号:150)InnoDB添加外键约束

时间:2011-08-25 02:02:24

标签: foreign-keys innodb constraints

真的很讨厌使用其他人的时间,但似乎问题不会消失。

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

2 个答案:

答案 0 :(得分:9)

您需要在类别表中对category_id建立索引(我看到它是主键的一部分,但由于它是索引中的第二列,因此无法使用)。您在外键中引用的字段始终应编入索引。

答案 1 :(得分:1)

在我的情况下,问题更像是您链接到的第一篇文章中描述的问题。

所以我必须确保:

  • Referenced Column是一个索引,
  • Referencing ColumnReferenced Column共享相同的类型和长度,例如两者都是INT(10)
  • 两者共享相同的 not null unsigned 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-03-13 :再次遇到此问题,最终找到了自己的答案。这次它没有帮助。事实证明,另一张表仍然设置为MyISAM,只要我将其更改为InnoDB一切正常。