复合键作为外键(sql)

时间:2012-03-20 01:09:15

标签: 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`)
) 

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

2 个答案:

答案 0 :(得分:23)

Per the mySQL documentation您应该能够设置外键映射到复合,这需要您创建多个列。

添加列并将其放在group

FOREIGN KEY (`beggingTime`,`day`,`tutorId`) 
    REFERENCES tutorial(`beggingTime`,`day`,`tutorId`)

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

答案 1 :(得分:1)

1]重写第一个表:首先放置tutorId,它自动成为一个键。实际上,除了最后一个复合列之外的所有列都成了关键。

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 mykey (`tutorId`,`beggingTime`,`day`)
) 

2]拥有如此多的索引对于繁重的写表来说非常昂贵。因此,请考虑将教程中的其他字段用作外键;也许是auto_increment record_id。给它一些想法。