代码之家  ›  专栏  ›  技术社区  ›  Kev

你能/如何在不破坏RI的情况下添加一个参考圆?

  •  3
  • Kev  · 技术社区  · 16 年前

    我主要对PGSQL感兴趣,但是我想知道在任何RDBMS中是否有一种方法来执行插入操作, 没有 在两个相互引用的表上禁用并重新启用任何外键或非空约束。(你可能会认为这是一只从自己的蛋中诞生的鸡。)

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

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

    3 回复  |  直到 16 年前
        1
  •  4
  •   Neall    16 年前

    我认为你回答了你自己的问题——你必须做一个事务块。在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;
    

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

        2
  •  0
  •   Bill Karwin    16 年前

    我会这样做:

    1. 定义问题。正确回答为 可以为空的列。
    2. 在问题中插入行,正确答案设置为空。
    3. 在答案中插入行,引用问题中的行。
    4. 更新问题设置正确答案 =?
        3
  •  0
  •   David Schmitt    16 年前

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