可以保存重复值的外键

Posted

技术标签:

【中文标题】可以保存重复值的外键【英文标题】:Foreign key that can hold duplicate values 【发布时间】:2014-04-24 21:28:03 【问题描述】:

下表中的product_rate_id 列需要作为外键从另一个表中引用。 但是,product_rates TABLE 必须包含 product_rate_id 的重复值。 (遗留系统,不要问为什么)

CREATE TABLE product_rates
(
    row_id             INT  IDENTITY(1,1) NOT NULL,
    product_rate_id    INT NOT NULL,
    START_DATE         DATETIME NOT NULL,
    end_date           DATETIME,
   unit_rate          NUMERIC(18,6)
)

所以问题是:你可以让另一个表作为外键引用的列包含重复值吗? 有什么解决办法吗?

【问题讨论】:

Can foreign key NULL and duplicate? 的可能重复项 上面的问题有一个很好的答案。简短的回答是外键约束不必是唯一的。 如何创建非唯一约束? @GoatCO 我正在以不同的方式阅读这个问题 - 我正在阅读的是外键 引用 到 (product_rate_id) 的列是非唯一的。这是两个不同的问题。 Col1 int FOREIGN KEY REFERENCES OtherTable(Id_Field) 在这种情况下,Col1 可以有多个重复值,ID_Field 必须应用唯一约束。 【参考方案1】:

您能否让另一个表作为外键引用的列包含重复值?

否 - 外键约束必须引用唯一键。

您仍然可以在相关表中保留对product_rate_id 值的(非外键)引用,但您必须在查询时决定需要哪些相关记录(I' m 假设使用start_dateend_date 之间的生效日期。

【讨论】:

对不起,我不同意。您可以有一个像 Order.id_order 这样的 PK,以及一个对 Order_Detail.id_order 的 FK,有多个行(订单详细信息)与唯一的 id_order 值(FK 不唯一或重复)相关联。 @EugenioF.MartinezPacheco 这不是问题——问题是你能不能有一个引用 product_rate_id 的外键,它不是唯一的。 好吧,我明白了,你是对的@d-stanley :P ..... 也许“product_rate_id”应该替换为代理键作为 PK,或者为 FK 选择复合键...问候!

以上是关于可以保存重复值的外键的主要内容,如果未能解决你的问题,请参考以下文章

数据库保存的外键约束

mysql 中的外键key值的详解

Navicat for MySQL 为啥我设置的外键保存后会消失?

保存的JAVA报错,帮忙看看,应该是主表里的主键跟明细表里的外键有问题了

MySQL:数据管理

非主键的外键