复合键作为外键(sql)

dga*_*ma3 21 mysql sql phpmyadmin

这是我关注的两个表:

CREATE TABLE IF NOT EXISTS `tutorial` (
  `beggingTime` time NOT NULL,
  `day` varchar(8) NOT NULL,
  `tutorId` int(3) NOT NULL,
  `maxMembers` int(2) NOT NULL,
  `minMembers` int(1) NOT NULL,
  PRIMARY KEY (`beggingTime`,`day`,`tutorId`),
  KEY `tutorId` (`tutorId`)
) 


CREATE TABLE IF NOT EXISTS `group` (
  `groupId` tinyint(3) NOT NULL AUTO_INCREMENT,
  `status` varchar(20) NOT NULL,
  `groupName` varchar(50) NOT NULL,
  PRIMARY KEY (`groupId`)
) 
Run Code Online (Sandbox Code Playgroud)

我想在'group'中创建一个链接到'tutorial'中复合唯一键的字段.所以我想我的问题是,我如何联系这些表?我是否必须在'tutorial'中为每个主键创建外键字段?

Jus*_*ony 23

根据mySQL文档,您应该能够设置外键映射到复合,这将要求您创建多个列.

添加列并将其放在group表中

FOREIGN KEY (`beggingTime`,`day`,`tutorId`) 
    REFERENCES tutorial(`beggingTime`,`day`,`tutorId`)
Run Code Online (Sandbox Code Playgroud)

正如Steven在下面的评论中提到的那样,你应该尝试重新设计它,以便教程表使用实际的主键(即使它只是一个身份代理键).这样可以提高性能,因为SQL是为这种类型的关系而构建的,而不是复合关系.

  • @nwarp,我完全同意你的观点。这部分答案介于误解和都市神话之间。 (4认同)
  • 尽管有可能,但这必须有严重的性能损失.映射到外键的主键几乎是行业标准. (3认同)
  • 我为评论一个6岁的答案而道歉,但我不明白为什么解决方案可能会导致"严重的性能损失",或者为什么复合主键不被视为"实际的主键".复合主键是否应该与相同大小的单个主键具有非常相似的性能? (3认同)
  • 警告:引用的列必须与创建它们的顺序相同.要获得正确的顺序,请右键单击外键(在SSMS中展开表时在keys文件夹下)并将脚本创建到剪贴板.糊.确保您引用的列与您的键的顺序相同. (2认同)