7

クイズの質問と回答を保存するデータベースを作成しようとしています

私はこれまでに2つのテーブルを持っています:

questions: (Question ID(PK), question string, correct answer ID)

answers: (Answer ID(PK), answer string, question ID)

外部キー制約の設定に問題があります。確かに、 がテーブルに存在し、テーブルにもcorrect answer ID存在することを確認する必要があります。ただし、SQliteStudio でこれらの外部キーを追加しようとすると、B > A からの外部キー制約が既に存在する場合、テーブル A > B を参照する外部キーを追加できないことを示すエラーが表示されます。answersquestion IDanswersquestions

4

4 に答える 4

5

この動作は正しいです。そうしないと、ニワトリが先か卵が先かという問題が発生します。最初に質問の行を挿入しないと回答を挿入できません。また、最初に有効な回答を挿入しないと質問を挿入することもできません。それ。参照されている質問または回答を削除しようとすると、同様の問題が発生します。

is_correctこれに対する一般的な解決策は、answerテーブルに列を追加することです。

于 2012-06-30T10:20:26.660 に答える
0
  1. あなたの問題に固有:外部キー列がnull可能かどうかにかかわらず、テーブルが空の場合、相互に参照している2つのテーブル間で外部キー制約を設定することに問題はありません。

ただし、これらのテーブルの両方がデータで満たされている場合は、主キー データと null 許容型の外部キー列に注意する必要があります。たとえば、テーブルの質問

QuestionID Question AnwerID 1 'Question1' 1 2 'Question2' 2

AnswerID Answer QuestionID 3 'Answer1' 3 4 'Answer2' 4

ここで、外部キー制約を設定しようとすると、これらがすでに外部キー規則に違反しているため、u は失敗します。

簡単なことは、現在のデータがそれらに違反していない場合にのみ、外部キー制約を設定できることです。

  1. シナリオの場合に外部キー列で null が許可されない場合、外部キー制約を設定した後、3 番目の列 (QuestionID または AnswerID) の現在のデータのみに制限されます。

  2. NULL を使用して実装できる場合でも、削除にも同じことが当てはまります。両方のテーブルを追跡する必要があります: 参照テーブルの対応する列に null を設定します テーブルのドロップは機能しません

より良いアプローチ: これらの QuestionID、AnswerID は、別のテーブル SchemaName.[Mapping] にマップする必要があります。正しい回答 ID のロジックを使用します。サポートするかどうかに関係なく、N*N マッピングを検討してください。

両方のテーブルを内部的にリンクしないでください。

于 2012-07-01T14:43:49.033 に答える
0

この状況は、関係テーブルでモデル化できると思います。

QA: (Question ID (FK), Answer ID (FK), Correct, ...)2 つの FK はテーブルの PK を表します。

于 2012-06-30T10:38:27.490 に答える
0

http://www.sqlite.org/foreignkeys.html#fk_schemacommands

外部キー制約が有効になっている場合、ALTER TABLE コマンドの動作は次の 2 つの点で異なります。

新しい列のデフォルト値が NULL でない限り、"ALTER TABLE ... ADD COLUMN" 構文を使用して、REFERENCES 句を含む列を追加することはできません。そうしようとすると、エラーが返されます。

...

ALTER TABLE および DROP TABLE コマンドに対するこれらの機能強化の目的は、少なくとも外部キー制約が有効になっている間は、外部キー違反を含むデータベースの作成に使用できないようにすることです。

于 2012-06-30T10:21:10.297 に答える