2012-06-30 38 views
1

我想创建一个数据库来存储用于测验的一些问题和答案两个表,每一个外键引用其他

我到目前为止有两个表:

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

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

我无法建立外键约束。当然,我需要确保correct answer ID存在answers并且还question IDanswers存在于questions表。但是,当试图在SQliteStudio中添加这些外键时,出现错误提示我无法添加外键引用表A> B,此时已有外键约束从B> A。

回答

4

此行为是正确的。否则,您会遇到鸡与鸡的问题:如果不先插入问题行,您将无法插入答案,而且如果不先插入有效答案,也无法插入问题它。你会得到一个类似的问题,试图删除被引用的问题或答案。

到这种情况的典型解决方案是添加一列is_correctanswer表。

+1

我曾考虑过鸡和鸡蛋的情况,但后来我认为你可以在外键字段中添加具有空值的行,并在所有行添加后更新它们。我想这会让你知道其他潜在的问题。感谢您的建议 –

+0

我也喜欢您提供的解决方案,因为它允许多个正确答案的问题的可能性 –

0

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

ALTER TABLE命令的作品在不同的两个方面,当外国 键约束是有效的:

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

...

这些增强功能ALTER TABLE和DROP TABLE命令 是确保他们不能被用于创建数据库 包含外键冲突,至少当外键 的意图约束被启用。

0

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

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

0
  1. 具体到你的问题: 有两个表都提到彼此时表是,尽管外键列是否可为空或不为空之间建立外键约束没有问题。

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

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

AnswerID答案QuestionID 3 '正确答案为' 3 4 'ANSWER2' 4

现在,如果你尝试设置外键约束然后你失败,因为这些已经违反了外键规则。

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

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

  2. 即使如果你能够使用NULL实现它,那么同样适用于删除。 你必须TRAC两个表:设置为null,在提及表 删除表中的相应栏将无法正常工作

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

请勿在内部链接两个表格。

相关问题