2012-01-24 55 views
7

我想創建一個數據庫,它有兩個相互依賴的外鍵的表。mysql - 相互依賴的外鍵

第一個表被稱爲問題,它包含有關用戶提問的問題的數據,並且還需要保留關鍵問題以回答問題的答案。 (這應該是一個外鍵,我們的第二個表被叫應答)

第二個表是被叫應答,它保留有關問題答案的信息,也需要持有一個question_id場,那就是問題的關鍵是這個答案回答。 這也是一個外鍵,第一個表。

當我嘗試創建表時,它不能創建第一個表,因爲它不知道第二個表(當我們嘗試將外鍵聲明爲第二個表時還沒有存在時出錯)

這裏是代碼我使用:

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

創建沒有外鍵約束的第一個表。然後按原樣創建第二個表格。最後,返回並修改第一個表,分別添加外鍵約束。

和SQL添加外鍵看起來就像這樣:

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

只是好奇,但爲什麼保持兩個表中的問題 - 反饋關係?因爲(正如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

這是一個更好的方法,但棘手的是確保每個問題只有一個答案是最好的。我知道如何用Oracle DBMS做到這一點,但我不認爲MySQL支持基於函數的索引,唯一的或其他的。 – APC

+2

不錯,但我寧願有一個best_answer表。 –

+0

您也可以使用AFTER UPDATE觸發器以相同的question_id清除其他答案的標誌。 –

5

考慮讓擺脫question.best_a_id的,相反,增加了best_answers表:

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) 
); 

如果你曾經有超過一個特定的問題(也許平局)一個最佳答案多,加上best_a_id列也是主鍵。

+0

我編輯了你的答案,以正確反映參考。 –

+0

謝謝,@ypercube –

+0

在MySQL中,''(a_id,q_id)''上的''answer'中的'UNIQUE KEY'也是需要的。 –