真的很讨厌使用其他人的时间,但似乎问题不会消失。
我在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)
答案 0 :(得分:9)
您需要在类别表中对category_id建立索引(我看到它是主键的一部分,但由于它是索引中的第二列,因此无法使用)。您在外键中引用的字段始终应编入索引。
答案 1 :(得分:1)
在我的情况下,问题更像是您链接到的第一篇文章中描述的问题。
所以我必须确保:
Referenced Column
是一个索引,Referencing Column
和Referenced Column
共享相同的类型和长度,例如两者都是INT(10)
,此处是Referencing Column
为referencing_id
且Referenced Column
为referenced_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一切正常。