可以/如何在不破坏RI的情况下添加一个参考圈?

时间:2008-10-07 17:42:22

标签: sql postgresql foreign-keys

我主要对pgsql感兴趣,但我想知道在任何RDBMS中是否有办法进行插入操作,没有禁用并重新启用任何FOREIGN KEY或NOT NULL约束,在两个相互引用的表上。 (你可能会认为这是一只以某种方式从它自己的蛋中诞生的鸡。)

对于一个实际的例子,如果你有一个多项选择测验系统,表“问题”和“答案”,其中question.correct_answer指的是answer.id,而answer.question指的是question.id,是吗?可以同时添加问题及其答案吗?

(为了记录,我知道您可以在事务块中执行禁用和重新启用,而另一个解决方案是没有correct_answer列,而是将answer.correct作为布尔值并且具有检查约束,确保每个问题确实有一个正确的答案。但我不会对这里的替代解决方案感到好奇。)

3 个答案:

答案 0 :(得分:4)

我认为你回答了自己的问题 - 你必须做一个交易阻止。在PostgreSQL中,这应该有效:

BEGIN;
  SET CONSTRAINTS ALL DEFERRED;
INSERT INTO questions (questionid, answerid, question)
  VALUES (1, 100, 'How long are Abraham Lincoln\'s legs?');
INSERT INTO answers (answerid, questionid, answer)
  VALUES (100, 1, 'Long enough to reach the ground.');
COMMIT;

它必须位于事务块中,因为如果INSERT语句失败,则数据库将处于无效状态(不满足表约束)。

答案 1 :(得分:0)

我会按以下方式进行:

  1. 将Questions.correct_answer定义为 可空栏目。
  2. 将行插入问题,并将correct_answer设置为NULL。
  3. 将行插入Answers,引用问题中的行。
  4. 更新问题SET correct_answer =?

答案 2 :(得分:0)

在一个问题和一个答案的简单情况下,建议将所有属性放在一个表中。