我主要对pgsql感兴趣,但我想知道在任何RDBMS中是否有办法进行插入操作,没有禁用并重新启用任何FOREIGN KEY或NOT NULL约束,在两个相互引用的表上。 (你可能会认为这是一只以某种方式从它自己的蛋中诞生的鸡。)
对于一个实际的例子,如果你有一个多项选择测验系统,表“问题”和“答案”,其中question.correct_answer指的是answer.id,而answer.question指的是question.id,是吗?可以同时添加问题及其答案吗?
(为了记录,我知道您可以在事务块中执行禁用和重新启用,而另一个解决方案是没有correct_answer列,而是将answer.correct作为布尔值并且具有检查约束,确保每个问题确实有一个正确的答案。但我不会对这里的替代解决方案感到好奇。)
答案 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)
我会按以下方式进行:
答案 2 :(得分:0)
在一个问题和一个答案的简单情况下,建议将所有属性放在一个表中。