可以保存重复值的外键
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_date
和end_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 选择复合键...问候!以上是关于可以保存重复值的外键的主要内容,如果未能解决你的问题,请参考以下文章
Navicat for MySQL 为啥我设置的外键保存后会消失?