为什么我有“无法创建表'。\ matchingup.frm'(错误号:150)”这样一个简单的表

时间:2014-10-02 00:21:15

标签: mysql sql

我有一张表“MatchingUpRound”如下:

    CREATE TABLE `matchingupround` (
  `eventID` int unsigned NOT NULL,
  `roundNo` tinyint unsigned NOT NULL,
  PRIMARY KEY  (`eventID`,`roundNo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

然后我尝试创建另一个表“MatchingUp”:

   CREATE TABLE `matchingup` (
  `eventID` int unsigned NOT NULL,
  `roundNo` tinyint unsigned NOT NULL,
  `successfulMatching` boolean default false,
   primary key (eventID),
  Foreign key (roundNo) References MatchingUpRound (roundNo)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

但得到了这个错误Can't create table '.\matchingup.frm' (errno: 150)。这是非常激烈的?

我做错了吗?

1 个答案:

答案 0 :(得分:3)

问题是外键约束,根本原因是引用表中的“roundno”没有合适的索引。

如果你运行:

CREATE INDEX matchingupround_IX1 ON matchingupround(roundno);

然后你可以创建外键。

MySQL需要一个以“roundno”作为前导列的索引。另一种方法是重新排序父表的PRIMARY KEY中的列。 (然后我建议的其他索引将是多余的,但您可能希望在PRIMARY KEY中的另一列上添加索引。)


通常,外键引用父表的PRIMARY KEY。但是,它也可以引用一个独特的键。 MySQL更宽松,并允许外键引用任何索引列(或列)。在这种情况下,子行可能匹配父表中的多行(这对我来说似乎很奇怪。)