我有一张表“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)
。这是非常激烈的?
答案 0 :(得分:3)
问题是外键约束,根本原因是引用表中的“roundno”没有合适的索引。
如果你运行:
CREATE INDEX matchingupround_IX1 ON matchingupround(roundno);
然后你可以创建外键。
MySQL需要一个以“roundno”作为前导列的索引。另一种方法是重新排序父表的PRIMARY KEY中的列。 (然后我建议的其他索引将是多余的,但您可能希望在PRIMARY KEY中的另一列上添加索引。)
通常,外键引用父表的PRIMARY KEY。但是,它也可以引用一个独特的键。 MySQL更宽松,并允许外键引用任何索引列(或列)。在这种情况下,子行可能匹配父表中的多行(这对我来说似乎很奇怪。)