3

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

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

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

4

3 回答 3

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 语句失败,数据库将处于无效状态(不满足表约束)。

于 2008-10-07T18:00:23.870 回答
0

我会通过以下方式做到这一点:

  1. 将 Questions.correct_answer 定义为可为空的列。
  2. 在 Questions 中插入行,将 correct_answer 设置为 NULL。
  3. 在 Answers 中插入行,引用 Questions 中的行。
  4. 更新问题 SET correct_answer = ?
于 2008-10-07T18:04:15.470 回答
0

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

于 2008-10-29T13:13:38.600 回答