3

私は主にこれについてpgsqlに興味がありますが、相互に参照する2つのテーブルで、FOREIGN KEYまたはNOT NULL制約を無効にして再度有効にすることなく、RDBMSで挿入操作を行う方法があるかどうか疑問に思っていました. (これは、自分の卵から生まれたニワトリと考えてよいでしょう。)

実用的な例として、多肢選択式のクイズ システムに「question」と「answer」というテーブルがあり、ここで question.correct_answer が answer.id を参照し、answer.question が question.id を参照している場合、追加することは可能ですか?質問とその回答を同時に?

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

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をnull許容列として定義します。
  2. correct_answerをNULLに設定して、質問に行を挿入します。
  3. 質問の行を参照して、回答に行を挿入します。
  4. 質問の更新SETcorrect_answer=?
于 2008-10-07T18:04:15.470 に答える
0

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

于 2008-10-29T13:13:38.600 に答える