SQL - 唯一键而不是主键



我在 5 个可空列上具有唯一的禁忌,这些列表示一行的标识符。 是否可以创建唯一键并在其上创建聚集索引而不是主键?我不能在这些列上使用主键,因为它们可以为空,并且我无法创建标识列,因为有很多删除和插入,它会在此标识列上溢出。

是的,并且有一种观点认为这实际上比主键"更好",因为主键列不可为空的规则在许多方面都是人为约束。

如果将其设为UNIQUE CLUSTERED INDEX则几乎可以得到主键带到表中的所有内容,除了列必须不可为空的不需要的规则。 但是,它们必须仍然是唯一的,因此您只能有一行,例如索引中的所有五列都是 null。

因此,您可以在创建外键约束时使用索引,您将保证存储顺序数据,并且每一行必须是唯一的。 但是,索引对于查询可能不是非常有用,而且,因为它会很宽,并且您说有很多删除/插入,因此它倾向于碎片化您的数据。

就个人而言,我很想把它作为一个独特的约束,但不是集群的。 然后,它将完成防止创建非唯一数据的工作。

然后,您可以添加代理项键并将其设置为主键。 我怀疑你这样做会"用完"(或"溢出"?)数字。


那么我为什么要使用代理键呢?

您的代理项键会窄得多,因此由于如此多的插入/更新/删除而导致的碎片影响较小。

如果需要扩展数据库,它很有用。 假设您只有一个表,并且这始终是整个数据库中唯一的表。 在这种情况下,不打扰代理键是有意义的。 它不会给你任何价值;这只是不必要的开销。

但是,假设您的"主"表(具有 5 列形成唯一键的表)上挂着其他表。 在此处添加代理键允许您创建具有单个 id 的任何子表,该子表链接回父表。 另一种方法是在每次创建子表时强制添加构成唯一(候选)键的所有五列。

现在,您有一个实际上具有用途的窄聚集索引,并且碎片不会像五列那样严重。

最新更新