标识列Vs主键

时间:2012-10-17 10:25:57

标签: sql sql-server-2008-r2 primary-key identity

我们如何决定使用Identity列或主键?

4 个答案:

答案 0 :(得分:4)

这两个概念并不相互排斥。所有组合都是可能的:

  • 同时也是主键的标识列
  • 不是主键的标识列
  • 不是标识的主键列
  • 既不是主键也不是标识
  • 的列

请注意,标识列通常用作主键,因为它保证是唯一的,并且它通常是所需的架构字段的补充,因此如果架构更改,则无法进行更改。

答案 1 :(得分:2)

在需要自动增量时使用Identity列。期!就那么简单。通常,标识列是主键的良好候选者。

主键只是一个概念。在主键背后重要的是它在列上创建了一个CLUSTERED INDEX,所以理论上,如果你有一个具有唯一聚簇索引的表,你就不需要“主键”。

我建议你google并阅读这两个概念,这些概念非常重要,可以理解

答案 2 :(得分:1)

从经验而不是理论我发现使用不被用户共享的密钥作为“用户数据”很重要。也就是说,用户数据和密钥应该是不同的字段。

我们有一个使用项目代码的数据库。项目代码是唯一的,永远不会为空,并且具有一旦分配的业务规则永远不会被更改。这使它成为候选人。

但是,如果用户看到项目代码,按项目代码查找文件等等,那就是他们的数据,他们希望围绕项目代码更改业务规则。

我们的项目代码是客户ID,后跟破折号和序列号,使其独一无二。如果针对一个客户ID的建议项目最终签订了不同客户ID的合同,则用户希望更改项目代码。如果用户使用错误的客户ID输入,则他们想要更改项目代码。更改主键以及引用它的所有外键都存在问题。

这似乎没有(似乎)回答问题我们如何决定使用Identity列或主键?

但是,如果你不使用客户数据作为主键,(我刚才认为你不应该这样做)那么主键需要自动生成,因为你不能指望用户输入它

答案 3 :(得分:0)

您应该始终使用主键,它只是使您的数据库可扩展。使用GUID或UUID或其他任何唯一的。