【发布时间】:2022-01-25 17:14:51
【问题描述】:
我有一个使用自然主键的临时表。此表存储一个导入的 CSV 文件,它是一个历史表,用于跟踪每次导入。我开始看到主键字段的一些重复项(在我导入的 CSV 中),并希望保留这些记录而不丢失历史表的功能。我目前在导入之前手动从 CSV 中删除行。
是否可以有一个由自然键和代理键组成的主键?自然键已被使用,并且是一个自动递增键,仅当存在重复的自然 id 时才会递增。
【问题讨论】:
-
“我开始看到主键字段的一些重复项” 这是不可能的。主键根据定义是唯一的,因此不能重复。
-
'in the CSV' 导入前从 CSV 中删除行,但希望保留两条记录。
-
您不能在历史表中强制使用自然键,因为该键元组标识的“实体”会随着时间而变化。一个简单的例子是
、 、 。无法强制执行自然键“Bob”,因为您希望(据我所知)捕获所有这些行。您将需要一个人工密钥作为唯一标识符。通常,执行自然键的是实际的实体表,而历史表只是对前者有一个外键。这里似乎有些可疑。
标签: sql-server tsql primary-key surrogate-key natural-key