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

Database 两个表,每个表都有一个外键引用另一个表,database,sqlite,foreign-keys,Database,Sqlite,Foreign Keys,我正在尝试创建一个数据库来存储一些问答题 到目前为止,我有两张桌子: 问题:(问题ID(PK)、问题字符串、正确答案ID) 答案:(答案ID(主键)、答案字符串、问题ID) 设置外键约束时遇到问题。当然,我需要确保答案中存在正确答案ID,并且答案中的问题ID也存在于问题表中。但是,当尝试在SQliteStudio中添加这些外键时,出现错误,这表明我无法添加引用表a>B的外键,因为已经存在来自B>a的外键约束。此行为是正确的。否则,您将遇到鸡和蛋的问题:如果不先为问题插入行,您将无法插入答案;如果

我正在尝试创建一个数据库来存储一些问答题

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

问题:(问题ID(PK)、问题字符串、正确答案ID)

答案:(答案ID(主键)、答案字符串、问题ID)


设置外键约束时遇到问题。当然,我需要确保
答案中存在
正确答案ID
,并且
答案中的
问题ID
也存在于
问题表中。但是,当尝试在SQliteStudio中添加这些外键时,出现错误,这表明我无法添加引用表a>B的外键,因为已经存在来自B>a的外键约束。

此行为是正确的。否则,您将遇到鸡和蛋的问题:如果不先为问题插入行,您将无法插入答案;如果不先为问题插入有效答案,您也无法插入问题。如果您试图删除被引用的问题或答案,将出现类似问题

一个典型的解决方案是在
答案
表中添加一列
是否正确。

altertable命令在两个方面的工作方式不同 关键约束已启用:

无法使用“ALTERTABLE…ADD COLUMN”语法来 添加包含REFERENCES子句的列,除非默认值为 新列的值为NULL。尝试这样做会返回一个错误

这些对ALTER表和DROP表的增强的目的 命令用于确保它们不能用于创建数据库 包含外键冲突的,至少在外键 已启用约束


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

QA:(问题ID(FK)、答案ID(FK)、正确,…)
两个FK代表表的主键

  • 针对您的问题: 当表为空时,无论外键列是否可为空,在两个相互引用的表之间设置外键约束都没有问题
  • 但当这两个表都被数据填充时,我们必须记住主键数据和可为null类型的外键列。例如 表格问题

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

    答案回答问题 3'回答1'3 4'回答2'4

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

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

  • 如果在您的场景中外键列不允许null,那么在设置外键约束后,您仅限于第三列中的当前数据(QuestionID或AnswerID)

  • 即使您能够使用NULL实现它,也同样适用于删除。 您必须跟踪这两个表:将null设置为引用表中的相应列 升降台坏了

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


    不要在内部链接这两个表。

    我确实考虑过鸡和蛋的情况,但是我假设您可以在外键字段中添加带有
    null
    值的行,并在添加所有行后更新它们。我想这会让你面临其他潜在的问题。谢谢你的建议我也喜欢你提出的解决方案,因为它允许对一个问题有多个正确答案