如何编写处理多个字段的外键约束

时间:2013-01-06 02:08:54

标签: mysql sql database foreign-keys

问题

是否为foreign keys设置了Answer表格正确的想法以及如何在处理多个字段的添加外键约束上编写SQL?

会话表:

SessionId (PK) SessionName
1              AAA
2              AAB

问题表:

QuestionId(PK)  SessionId(PK)  QuestionContent
1               1              What is 2+2?
2               1              What is 3+3?
1               2              What is 4+4?
2               2              What is 5+5?

答案表:

AnswerId(auto, PK)  QuestionId(fk)  SessionId(fk)  Answer
1                   1               1              A
2                   1               1              D
3                   2               1              C
4                   2               1              A
5                   1               2              True
6                   2               2              A
7                   2               2              B

现在我遇到的问题是带有Answer表的外键,我想知道哪个外键是正确的。

我所做的是向SessionId添加外键,这意味着如果我点击行SessionId,它就会匹配SessionId中的Session表。

然后我想我会在QuestionId表格中Answer提供外键,链接到Question表。但问题是,如果我在一行中点击了QuestionId,那么它会显示QuestionId中包含相同QuestionId的所有行。所以如果我想查找Answer

AnswerId(auto, PK)  QuestionId(fk)  SessionId(fk)  Answer
1                   1               1              A

当我点击上面的QuestionId外键时,它会输出以下内容:

QuestionId(PK)  SessionId(PK)  QuestionContent
1               1              What is 2+2?
1               2              What is 4+4?

答案不属于这两个问题,它只属于一个问题,但由于QuestionId两个都是相同的,它会显示两个问题。

所以我想的是我想要一个外键约束,如果用户点击一行QuestionId,它会同时查找QuestionIdSessionId以便它知道答案所属的问题和会话(考试),以便输出如下:

QuestionId(PK)  SessionId(PK)  QuestionContent
1               1              What is 2+2?

我的问题是我不知道如何编写处理两个字段的外键约束?仅设置SessionIdSessionId and QuestionId的外键是否正确?

2 个答案:

答案 0 :(得分:3)

您可以使用以下语法为Answers表创建复合外键:

FOREIGN KEY (QuestionId, SessionId) REFERENCES Questions (QuestionId, SessionId)

但是,看起来问题表的SessionId列是复合主键的一部分似乎很奇怪,因为您有一个Sessions表,使用该名称作为主键的列。您可能应该考虑在会话表中将Questions.SessionId作为外键,并使QuestionId成为标准的单个主键。

如果你这样做,你会发现你在答案表上不需要SessionId列。

以下是您可能会做的一个示例:

-- Sessions table
SessionId (PK) | SessionName

-- Questions table
QuestionId (PK) | SessionId (FK) | QuestionContent

-- Answers table
AnswerId (PK) | QuestionId (FK) | Answer

答案 1 :(得分:2)

你是对的,在你当前的架构中,你想要在你的答案表上有2个索引; SessionId列中的1;在SessionId和QuestionId列上有1个。这是一篇关于如何做的帖子:

Multiple-column foreign key in MySQL?

另外,我可能会考虑将QuestionId设为身份/自动。不确定您是否收到任何附加值,使其在每个会话中重置。可以帮助简化您需要的一些索引。