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
值的行,并在添加所有行后更新它们。我想这会让你面临其他潜在的问题。谢谢你的建议我也喜欢你提出的解决方案,因为它允许对一个问题有多个正确答案