是否可以有一个自然的和代理的多列主键?

Is it possible to have a natural and surrogate multicolumn primary key?

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

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

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

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

如果您想要通过自然键提高性能,当然,只需将 PK 的第一列作为自然键,将第二列作为代理项,这样您就可以从聚簇索引中受益。