2012-01-24 10 views
7

相互に依存する外部キーを持つ2つのテーブルを持つデータベースを作成しようとしています。mysql - 相互に依存する外部キー

最初のテーブルは質問と呼ばれ、ユーザーからの質問に関するデータを保持しており、その質問に対して回答した最善の回答のキーを保持する必要があります。 (これは、Answerという2番目のテーブルの外部キーである必要があります)

2番目のテーブルはAnswerと呼ばれ、質問に対する回答に関する情報を保持しています。この答えは答えます。 これも最初のテーブルの外部キーです。

テーブルを作成しようとすると、2番目のテーブルを認識していないため、最初のテーブルを作成できません(まだ存在しない2番目のテーブルに外部キーを宣言しようとするとエラーが発生します)

ここ

は、私が使用していますコードです:

create table question 
(q_id    numeric(10,0), 
    best_a_id   numeric(10,0), 
primary key(q_id), 
foreign key (best_a_id) references answer(a_id), 
); 


create table answer 
(a_id    numeric(10,0), 
    q_id    numeric(10,0) not null, 
primary key(a_id), 
foreign key (q_id) references question(q_id), 
); 

どのように私はこの問題を解決するのですか? ありがとう

+1

同様の質問で私の答えを見てください。[互いに1対1の参照を持つテーブルに行を挿入するにはどうすればよいですか?](http://stackoverflow.com/questions/6691366/mysql-database-design -inserting-rows-in-1to1-tables/6692054#6692054) –

答えて

4

外部キー制約なしで最初のテーブルを作成します。次に、2番目の表をそのまま作成します。最後に、外来キー制約を別に追加して最初のテーブルを変更して変更します。興味があるだけ

ALTER TABLE question 
ADD FOREIGN KEY (best_a_id) 
REFERENCES answer(a_id); 

が、なぜ両方のテーブルの質問への回答の関係を維持する:外部キーを追加する

そしてSQLは次のようになりますか?質問が最初に尋ねられたとき(ypercubeが指摘するように)あなたは「最善の答え」を持っていないが、あなたのデザインはそれを必要とするからです。 Olivierの推薦方法と同様に、回答表でその関係を維持する方が良いでしょう。

+0

うわー!!!!本当にありがとう!!! =] –

+4

そして、どのように行を挿入しますか? –

+1

@happy dude: 'question.best_a_id'がNullableに設定されている場合にのみ動作します。 –

3

回答テーブルにフラグを追加します。

create table answer 
(a_id    numeric(10,0), 
    q_id    numeric(10,0) not null, 
    best_answer  numeric(1) default 0 not null, 
primary key(a_id), 
foreign key (q_id) references question(q_id), 
); 

質問表からbest_a_idを削除します。

+0

これはより良いアプローチですが、難しいのは、各QUESTIONに対して1つの回答だけが最良のものであることを保証することです。私はOracle DBMSでこれを行う方法を知っていますが、私はMySQLが関数ベースのインデックスをユニークにまたはそれ以外の方法でサポートしているとは考えていません。 – APC

+2

悪くないが、私はむしろbest_answerテーブルを持っているだろう。 –

+0

AFTER UPDATEトリガを使用して、同じquestion_idを持つ他の回答のフラグをクリアすることもできます。 –

5

question.best_a_idを取り除くと、その代わり、best_answersテーブルを追加し得ることを考慮:あなたは特定の質問(多分タイ)のための複数の最良の答えを持っていたい場合はbest_a_idを追加し、

create table best_answers 
(q_id    numeric(10,0), 
    best_a_id   numeric(10,0), 
primary key(q_id), 
foreign key (best_a_id, q_id) references answer(a_id, q_id) 
); 

列を主キーにも追加します。

+0

私はあなたの答えを編集して、参照を正しく反映しました。 –

+0

ありがとう、@ypercube –

+0

MySQLでは、 '(a_id、q_id)'のテーブル 'answer 'の' UNIQUE KEY'も必要です。 –