问题
是否为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
,它会同时查找QuestionId
和SessionId
以便它知道答案所属的问题和会话(考试),以便输出如下:
QuestionId(PK) SessionId(PK) QuestionContent
1 1 What is 2+2?
我的问题是我不知道如何编写处理两个字段的外键约束?仅设置SessionId
和SessionId and QuestionId
的外键是否正确?
答案 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设为身份/自动。不确定您是否收到任何附加值,使其在每个会话中重置。可以帮助简化您需要的一些索引。