Postgres - 如何将主键引用到非唯一值

时间:2014-09-28 22:18:48

标签: sql postgresql

所以我一直在做这个我最近得到的任务,而且我对如何引用特定的表格感到难过。所以,假设我有一张博物馆的作品表,它包含两个主键,组合使其成为字母数字。

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 个答案:

答案 0 :(得分: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)
);