主键和外键的复合键不能建立关系

Posted

技术标签:

【中文标题】主键和外键的复合键不能建立关系【英文标题】:Cannot make relation between composite key of primary key and foreign key 【发布时间】:2018-09-23 01:31:42 【问题描述】:

我有两张桌子: “项目”,具有三 (3) 个字段。两 (2) 个字段的一个复合键:Donor_Source & Project_Number 和项目标题

请注意,Donor_Source 字段的索引为 Yes(Duplicates OK),Project_Number 字段的索引为 Yes(No Duplicates)。 必须这样,因为捐助者可以支持多个项目。

最后还有 PRF_Table,它有很多字段,但由于我想将它与 Project 表相关联,所以我创建了两个字段用作 Projects 表的外键:

请注意,外键的两个字段都被索引为:NO。 当我试图关联这两个表时,我设法关联了两个表中的项目字段,但无法关联两个表的捐助者源字段:

从上图可以看出,我设法得到了 PRF_Table 和 Project 之间的多:1 关系,这是正确的。 PRF_Table 可以在特定项目上有很多记录,但该项目在 Project 表中只列出一次

在尝试关联 Donor_Source 字段时出现了问题:我总是得到不确定的关系(我想避免这种情况)。我猜这个问题可能是因为 Project 表中的 Donor_Source 字段虽然已编入索引,但它仍然可以有重复项,当然 PRF_Table 中也有重复项。

我应该怎么做才能获得多:1 关系 (PRF_Table:Projects)?

【问题讨论】:

【参考方案1】:

复合键中的所有字段都必须被寻址以创建参照完整性

因此,您必须:

    在 PRF_Table 中创建字段 Agrmnt_ID 并将其包含在与联结表的关系中。

    在与表 Projects 的关系中包括 PRF_Table 中的字段 Donor_Source。

【讨论】:

【参考方案2】:

您无需在PRF_Table 中为Agrmnt_ID 创建字段以具有引用完整性。到目前为止,您在 PRF_TablePRF-PO_Junction_Table 之间所做的一切都很好。

关于ProjectsPRF_Table 之间的链接,您的意图似乎是让Projects 中的每条记录能够与PRF_Table 中的多条记录相关联。如果是这样,那么您的解决方案是更改 Projects 中的主键,从而更改两个表之间的关系。

    在表 Projects 中,删除您当前的复合主键并创建一个自动编号字段(即名为 ProjectID)作为您的主键。

    现在,在 Projects 表中,在 Donor_SourceProject_Number 字段上创建唯一索引(复合唯一索引),这将为您提供与当前复合主键相同的效果在这种情况下,每个捐赠者可以参与多个项目,但同一捐赠者不能多次参与同一个项目。

    现在,您将在 PRF_Table 中创建与您在第 1 步中在 Projects 中创建的新主键相同的字段(即 ProjectID

    Projects 中的新主键和PRF_Table 中的新字段之间创建关系。这将允许Projects 中的每个项目/捐助者记录在PRF_Table 中拥有多个记录。

复合主键在联结表中最有用,例如您如何使用带有PRF-PO_Junction_Table 的主键。但是,在任何其他链接中,您希望尝试使用单个主键字段并仅使用唯一复合索引来强制两个或多个字段的唯一性。

【讨论】:

以上是关于主键和外键的复合键不能建立关系的主要内容,如果未能解决你的问题,请参考以下文章

数据库中主键和外键是干嘛用的?

3.啥是键、候选键、主键和外键?

具有主键和外键的事实表

谈谈mysql的主键和外键

主键和外键的区别:

数据库中主键和外键的作用?