RIに違反することなく、参照のサークルを追加できますか/どのように追加しますか?

StackOverflow https://stackoverflow.com/questions/179582

  •  05-07-2019
  •  | 
  •  

質問

私は主にこのためにpgsqlに興味がありますが、RDBMSで挿入操作を行う方法があるかどうか疑問に思っていました。互いに参照する2つのテーブルの制約。 (あなたはこれを何らかの形で自分の卵から生まれた鶏と考えるかもしれません。)

実用的な例として、複数選択式のクイズシステムがあり、「質問」テーブルがある場合、 " answer"(question.correct_answerがanswer.idを指し、answer.questionがquestion.idを指す場合)では、質問とその回答を同時に追加できますか?

(記録のために、トランザクションブロックで無効化と再有効化を行うことができ、別の解決策はcorrect_answer列を持たず、代わりにブール値としてanswer.correctを持ち、質問ごとに1つの正解があることを確認して制約をチェックします。ただし、ここで代替ソリューションについては興味がありません。)

役に立ちましたか?

解決

あなたはあなた自身の質問に答えたと思います-トランザクションをブロックしなければなりません。 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. UPDATE質問SET correct_answer =?

1つの質問と1つの回答という単純なケースでは、すべての属性を1つのテーブルに入れることをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top