主键的SQL数据类型 - SQL Server?

Ram*_*oni 43 sql-server database-design types

我们应该使用哪种sql数据类型作为数字基本主键:

  1. INT
  2. BIGINT
  3. 数字
  4. 浮动

Ken*_*tle 56

一般来说,int.

bigint 如果你认为你的行数比宇宙中的原子多.

uniqueidentifier如果您需要全局唯一键(在模式中的所有表中保证唯一的键,甚至可能是普遍唯一的(我不记得)),这非常有用

另外两个我不会使用它们不是整数类型(它们有分数,它们作为键没有多大意义)

  • 如果选择uniqueidentifier,请考虑将其设置为NONCLUSTERED主键,否则插入可能会出现性能问题. (4认同)
  • @KenGentle - 很好的答案,但如果你有超过4,294,967,296行,bigint仍然有用."比宇宙中的原子更多的行"指的是uint64的*MAX*,但有时你只需要使用bigint超过uint32的最大值.实践中可能遇到的两个例子:每个活着的人的数据记录超过32位限制; 类似地,将IPv6地址转换为uint需要48位(我喜欢使用其他16位用于标志或有时使用低分辨率时间戳;]) (4认同)
  • int仅限于'仅'约20亿.我已经通过一些日志记录功能达到了这个限制;) (3认同)
  • 并不是说这是肯非常有用的答案的重点,但是'bigint`的64位最大值远远不是宇宙中估计的原子数,大约10 ^ 80 - 这甚至不适合一个256位的整数.:) (2认同)

mar*_*c_s 22

你真的需要分开两个不同的问题:

1)主键是一个逻辑结构 - 唯一且可靠地标识表中一行的关键候选之一.这可以是任何东西,真的 - 一个INT,一个GUID,一个字符串 - 选择对你的场景最有意义的东西.

2)聚类键(在表上定义"聚簇索引"的一列或多列) - 这是一个与物理存储相关的东西,这里,一个小的,稳定的,不断增加的数据类型是你最好的选择 - INT或BIGINT作为默认选项.

默认情况下,SQL Server表上的主键也用作群集键 - 但这不一定是这样!在将以前的基于GUID的主群集密钥分解为两个单独的密钥 - GUID上的主(逻辑)密钥和单独的INT IDENTITY上的群集(排序)密钥时,我个人似乎随着时间的推移而获得了巨大的性能提升. ,1)专栏.

索引碎片降至最低水平,因此索引寻求性能提升 - 强烈推荐!