这是我关注的两个表:
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'中为每个主键创建外键字段?
答案 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。给它一些想法。