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

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

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

有帮助吗?

解决方案

我认为你回答了自己的问题 - 你必须做一个交易阻止。在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. 将Questions.correct_answer定义为 可空栏目。
  2. 将行插入问题,并将correct_answer设置为NULL。
  3. 将行插入Answers,引用问题中的行。
  4. 更新问题SET correct_answer =?

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top