【问题标题】:Is it possible to have a natural and surrogate multicolumn primary key?是否有可能有一个自然和代理的多列主键?
【发布时间】:2022-01-25 17:14:51
【问题描述】:

我有一个使用自然主键的临时表。此表存储一个导入的 CSV 文件,它是一个历史表,用于跟踪每次导入。我开始看到主键字段的一些重复项(在我导入的 CSV 中),并希望保留这些记录而不丢失历史表的功能。我目前在导入之前手动从 CSV 中删除行。

是否可以有一个由自然键和代理键组成的主键?自然键已被使用,并且是一个自动递增键,仅当存在重复的自然 id 时才会递增。

【问题讨论】:

  • “我开始看到主键字段的一些重复项” 这是不可能的。主键根据定义是唯一的,因此不能重复。
  • 'in the CSV' 导入前从 CSV 中删除行,但希望保留两条记录。
  • 您不能在历史表中强制使用自然键,因为该键元组标识的“实体”会随着时间而变化。一个简单的例子是 。无法强制执行自然键“Bob”,因为您希望(据我所知)捕获所有这些行。您将需要一个人工密钥作为唯一标识符。通常,执行自然键的是实际的实体表,而历史表只是对前者有一个外键。这里似乎有些可疑。

标签: sql-server tsql primary-key surrogate-key natural-key


【解决方案1】:

首先,是的,您可以选择 PK 包含的内容,这样您就可以让它同时包含自然键和代理键。

您的这部分想法对我来说很奇怪:“自动递增键,只有在存在重复的自然 id 时才会递增”。是什么让你问这个?你已经承认单靠自然钥匙无法覆盖你。如果自然值不是唯一的,为什么要竭尽全力避免具有替代值?即使那样,您也只能使用一些不起眼的触发器将值更改为例如零;作为 PK 的一部分,它仍然需要有一个值。

如果您的想法是通过自然键实现性能,当然,只需将 PK 的第一列设为自然键,将第二列设为代理,这样您就可以从聚集索引中受益。

【讨论】:

  • 我“竭尽全力避免使用代理值”的原因是因为代理值越多,历史表中的记录就越多。在这里按照您的想法,在更新表之前对数据进行排序减少了历史表中的记录并利用了性能。
猜你喜欢
  • 1970-01-01
  • 2023-02-26
  • 2016-11-15
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
相关资源
最近更新 更多