我正在尝试创建一个数据库来存储测验的一些问题和答案
到目前为止我有两张桌子:
questions: (Question ID(PK), question string, correct answer ID)
answers: (Answer ID(PK), answer string, question ID)
我在设置外键约束时遇到问题。当然,我需要确保correct answer ID
中存在answers
,而question ID
表格中answers
中的questions
也存在{{1}}。但是,当尝试在SQliteStudio中添加这些外键时,我收到的错误表明我无法添加外键引用表A> B,当已经存在来自B的外键约束时>甲
答案 0 :(得分:4)
这种行为是正确的。否则,你会遇到鸡与蛋的问题:如果没有先插入一行代码就无法插入答案,而且如果没有先插入有效答案,也无法插入问题它。尝试删除被引用的问题或答案时,您会遇到类似的问题。
典型的解决方案是在is_correct
表中添加一列answer
。
答案 1 :(得分:0)
http://www.sqlite.org/foreignkeys.html#fk_schemacommands
ALTER TABLE命令在外部时在两个方面的工作方式不同 启用了关键约束:
无法使用“ALTER TABLE ... ADD COLUMN”语法 添加包含REFERENCES子句的列,除非是默认值 新列的值为NULL。尝试这样做会返回错误。
...
对ALTER TABLE和DROP TABLE进行这些增强的意图 命令是确保它们不能用于创建数据库 包含外键冲突,至少在外键时 约束已启用。
答案 2 :(得分:0)
我认为这种情况可以用关系表建模:
QA: (Question ID (FK), Answer ID (FK), Correct, ...)
和2 FK代表表格的PK。
答案 3 :(得分:0)
但是当这两个表都填充了数据时,我们必须记住主键数据和可空类型的外键列。例如 表问题
QuestionID问题AnwerID 1'问题1'1 2'问题2'2
AnswerID答案问题ID 3'答案1'3 4'答案2'4
现在,如果您尝试设置外键约束,那么您将失败,因为它们已经违反了外键规则。
简单的事情是,只有当前数据不违反时才能设置外键约束。
如果在您的方案情况下外键列不允许为空,那么在设置外键约束之后,您仅限于第三列中的当前数据(QuestionID或AnswerID)
即使您能够使用NULL实现它,这同样适用于删除。 您必须trac两个表:将null设置为引用表中的相应列 丢弃表不起作用
更好的方法: 这些QuestionID,AnswerID应该映射到另一个表SchemaName。[Mapping] 使用您的逻辑来获得正确的答案ID。考虑是否支持N * N映射。
不要在内部链接两个表。