1

问题

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

然后我想我会QuestionIdAnswer表中提供一个外键链接到Question表。问题在于,如果在一行中单击 a 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一起正确?

4

2 回答 2

3

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

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

SessionId但是,考虑到您有一个使用该名称的列作为主键的 Sessions 表,您的 Questions 表列是复合主键的一部分似乎很奇怪。您可能应该考虑Questions.SessionId在 Sessions 表上创建一个外键,并且必须QuestionId是一个标准的单个主键。

如果您这样做,您会发现您的 Answers 表中不需要SessionId列。

这是您可能会执行的操作的示例:

-- Sessions table
SessionId (PK) | SessionName

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

-- Answers table
AnswerId (PK) | QuestionId (FK) | Answer
于 2013-01-06T02:35:16.523 回答
2

你是对的,在你当前的模式中,你希望你的 Answer 表上有 2 个索引;1 在 SessionId 列上;和 1 在 SessionId 和 QuestionId 列上。这是一篇关于如何做到这一点的帖子:

MySQL中的多列外键?

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

于 2013-01-06T02:32:58.463 回答