7

我正在尝试创建一个数据库来存储一些测验的问题和答案

到目前为止,我有两张桌子:

questions: (Question ID(PK), question string, correct answer ID)

answers: (Answer ID(PK), answer string, question ID)

我在设置外键约束时遇到了麻烦。当然,我需要确保correct answer ID存在于表中answers并且也存在于question ID表中。但是,当尝试在 SQliteStudio 中添加这些外键时,我收到错误提示,当已经存在来自 B > A 的外键约束时,我无法添加引用表 A > B 的外键。answersquestions

4

4 回答 4

5

这种行为是正确的。否则,您将遇到先有鸡还是先有蛋的问题:如果不先为问题插入一行,您将无法插入答案,并且如果不先插入有效答案,您也无法插入问题它。尝试删除所引用的问题或答案时,您会遇到类似的问题。

一个典型的解决方案是向表中添加一is_correctanswer

于 2012-06-30T10:20:26.660 回答
0

http://www.sqlite.org/foreignkeys.html#fk_schemacommands

启用外键约束时,ALTER TABLE 命令在两个方面的工作方式不同:

不能使用“ALTER TABLE ... ADD COLUMN”语法来添加包含 REFERENCES 子句的列,除非新列的默认值为 NULL。尝试这样做会返回错误。

...

对 ALTER TABLE 和 DROP TABLE 命令进行这些增强的目的是确保它们不能用于创建包含外键违规的数据库,至少在启用外键约束时是这样。

于 2012-06-30T10:21:10.297 回答
0

我认为这种情况可以用关系表来建模:

QA: (Question ID (FK), Answer ID (FK), Correct, ...)而2个FK代表表的PK。

于 2012-06-30T10:38:27.490 回答
0
  1. 具体到您的问题:无论外键列是否可以为空,当表为空时,在两个表之间设置外键约束都没有问题。

但是当这两个表都填充了数据时,我们必须记住主键数据和可空类型的外键列。例如表问题

QuestionID Question AnwerID 1 'Question1' 1 2 'Question2' 2

AnswerID 回答 QuestionID 3 'Answer1' 3 4 'Answer2' 4

现在,如果您尝试设置外键约束,那么您将失败,因为这些已经违反了外键规则。

简单的事情是,只有当您的当前数据不违反外键约束时,您才能设置外键约束。

  1. 如果在您的情况下外键列不允许为空,则在设置外键约束后,您仅限于第三列中的当前数据(QuestionID 或 AnswerID)

  2. 即使您能够使用 NULL 来实现它,也同样适用于删除。您必须同时跟踪两个表:将 null 设置为引用表中的相应列 Drop table 将不起作用

更好的方法:这些 QuestionID、AnswerID 应该映射到另一个表 SchemaName。[映射] 使用您的逻辑来获得正确的答案 ID。无论您是否支持,都考虑 N*N 映射。

不要在内部链接两个表。

于 2012-07-01T14:43:49.033 回答