2014-09-28 26 views
1

所以我一直在做這個任務,最近我得到了,它讓我難以理解如何引用特定的表。所以,假設我有一張博物館的作品表,它包含兩個主鍵,組合使它成爲字母數字。Postgres - 如何將主鍵引用到非唯一值

CREATE TABLE Works (
wrk_charid pdkeyone, 
wrk_numid pdkeytwo, 
wrk_name workname, 
wrk_type worktype, 
wrk_subtype worktype, 
wrk_donate donator, 
wrk_creation workDate, 
wrk_acquistion workdate, 
wrk_insurance insurance, 
wrk_desc description, 
wrk_curloc locationname DEFAULT 'Storage' 
REFERENCES LocationAreas 
    ON UPDATE CASCADE , 
PRIMARY KEY (wrk_charid, wrk_numid), 
UNIQUE (wrk_charid, wrk_numid) 

); 

所以這是我的作品表,我們有一個單獨的材料表。然而,許多作品的材料價值不止一個,導致了它不是唯一的錯誤。到目前爲止,我有表,我的材料如下:

CREATE TABLE Materials (
mt_charid pdkeyone, 
mt_numid pdkeytwo, 
mt_material materialdesc, 
PRIMARY KEY (mt_charid, mt_numid) 

); 

我不知道我究竟如何可以參考我的作品我沒有料運行到一個獨特的錯誤。有人能幫我推動我正確的方向嗎?

+1

的'UNIQUE(wrk_charid,wrk_numid)'也可以省略;它由PRIMARY KEY條款暗示。 – 2014-09-28 23:37:45

+0

哦,謝謝你的建議!我在課堂上得到了一種很好的答案,並認爲最好保持它,但謝謝你! – Phlex 2014-09-29 00:36:42

回答

3

由於關係是多對多的關係(一件作品可以有很多材料,一件材料可以出現在很多作品中) 您應該創建一個新的表格來添加它們之間的關係。 (基本上哪些工作有哪些材料)。 像這樣:

CREATE TABLE Works_Materials (
    wrk_charid work_pdkeyone, 
    wrk_numid work_pdkeytwo, 
    mt_charid material_pdkeyone, 
    mt_numid material_pdkeytwo, 
    PRIMARY KEY (work_pdkeyone, work_pdkeytwo, material_pdkeyone, material_pdkeytwo) 
    FOREIGN KEY (work_pdkeyone, work_pdkeytwo) REFERENCES Work(pdkeyone, pdkeytwo) 
    FOREIGN KEY (material_pdkeyone, material_pdkeytwo) REFERENCES Material(pdkeyone, pdkeytwo) 
); 
+0

好的...並且添加材料時,我會將其添加到此表中,而不是將它們添加到材料表中?你介意提供一個我如何輸入這些數據的例子嗎?我有點失落,因爲即使它是從一個文件添加到桌子上也是如此...... – Phlex 2014-09-28 22:49:51

+0

不,您仍將材料添加到材質表中,這僅僅是鏈接材質的鏈接表。 – Doon 2014-09-28 22:57:13

+0

哦,好的!十分感謝你的幫助! – Phlex 2014-09-28 22:58:20