两个表,每个表都有一个引用另一个的外键

时间:2012-06-30 10:15:01

标签: database sqlite foreign-keys

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

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

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的外键约束时>甲

4 个答案:

答案 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)

  1. 针对您的问题: 尽管外键列是否可以为空,但是当表为空时,在两个表之间设置外键约束都没有问题。
  2. 但是当这两个表都填充了数据时,我们必须记住主键数据和可空类型的外键列。例如 表问题

    QuestionID问题AnwerID          1'问题1'1          2'问题2'2

    AnswerID答案问题ID        3'答案1'3        4'答案2'4

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

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

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

    2. 即使您能够使用NULL实现它,这同样适用于删除。 您必须trac两个表:将null设置为引用表中的相应列 丢弃表不起作用

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

      不要在内部链接两个表。