Can /你如何在不破坏RI的情况下添加一个引用圈?
我主要对pgsql感兴趣,但我想知道在任何RDBMS中是否有方法执行插入操作,没有禁用并重新启用任何FOREIGN KEY或NOT NULL约束,互相参考。 (你可能会认为这是莫名其妙地从自己的蛋生鸡)Can /你如何在不破坏RI的情况下添加一个引用圈?
对于一个实际的例子,如果你有一个多项选择题测验系统,以表“问题”和“答案”,其中的问题.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语句失败,数据库将处于无效状态(表约束没有得到满足)。
我不知道“设置约束” - 谢谢! – Kev 2008-10-07 18:27:03
我会做下列方式:
- 定义Questions.correct_answer作为 空列。
- 将行插入到问题中,并将correct_answer设置为NULL。
- 将行插入Answers,引用问题中的行。
- UPDATE Questions SET correct_answer =?
在一个问题和一个答案的简单情况下,建议将所有属性放在一个表中。
该问题的标题不合适。尽量使它适合于实际的问题。 – Nick 2008-10-07 17:45:30
感谢您的建议。希望新的标题更有帮助。 – Kev 2008-10-07 17:51:15