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

53

用于数字基础主键的 SQL 数据类型应该使用:

  1. int(整型)
  2. bigint(大整型)
  3. numeric(数字)
  4. float(浮点型)

这要看情况!在什么样的情况下?请提供更多信息... - Mitch Wheat
5个回答

71

通常使用 int

如果您认为将有比宇宙中的原子数更多的行,则使用 bigint

如果您需要全局唯一键(在模式中保证在所有表格上都是唯一的,甚至可能是普遍唯一的),则可以使用 uniqueidentifier

其他两种类型我不会使用,因为它们不是整型(它们具有小数部分,作为键并没有太多意义)。


4
如果你选择使用唯一标识符(uniqueidentifier),那么请考虑将其设置为非聚集主键(NONCLUSTERED primary key),否则插入操作可能会出现性能问题。 - Brannon
3
整数类型的取值范围在大约20亿左右是有限制的。我使用了一些日志功能,已经达到了这个限制。 - Mose
4
@KenGentle - 回答得很好,但如果你有超过 4,294,967,296 行,则 bigint 仍然很有用。 "比宇宙中的原子还多"指的是 uint64 的 MAX,但有时您需要使用 bigint 超过 uint32 的最大值。 在实践中可能会遇到两个例子:每个活着的人的数据记录超过了 32 位限制;同样,将 IPv6 地址转换为 uint 需要 48 位(我喜欢使用其它的 16 位来做标志或者有时一个低分辨率的时间戳;]) - That Realty Programmer Guy
3
不过这并非Ken非常有用的答案的重点,但是bigint的64位最大值远远低于宇宙中估计的原子数量——约为10^80——即使使用256位整数也无法容纳。 :) - Charles Burns
@KenGentle - 哈哈哈,赞成行数超过宇宙原子数量的说法!! - Learner
如果您将数据类型的标识种子设置为最低负数,则可以将列中可存储的值的总数增加一倍。 - ESS

25

你需要把两个不同的问题分开考虑:

1)主键是一个逻辑结构 - 用于唯一可靠地标识表中某一行的关键候选项。这可以是任何东西 - 整数、GUID、字符串 - 根据您的情况选择最合适的。

2)聚集键(定义表上“聚集索引”的列)- 这是与物理存储相关的内容,而在这里一个小型、稳定、递增的数据类型是最佳选择 - INT或BIGINT作为默认选项。

默认情况下,SQL Server表上的主键也被用作聚集键 - 但不一定非得这样!我个人在将基于GUID的主聚集键拆分为两个独立键 - 基于GUID的主键和独立的INT IDENTITY (1,1)列上的聚类(排序)键时,看到了巨大的性能提升。

索引碎片降至最低水平,因此索引查找性能大幅提升 - 强烈建议使用!

Marc


是的,完全同意Marc的看法 - 只是普通人很少能够超越图表工具,右键单击设置PK也非常容易... - stephbu

3
不使用GUID作为主键的一个重要原因是它们对索引页面的填充比例非常糟糕 - 这种误用可能会显著增加I/O性能成本。应该将GUID留作AK,并尽可能使用基于int的PK驱动查询。

10
这句话有一点不准确——GUID作为主键是可以的,但作为聚集键(Clustering Key)就很糟糕。主键本身对数据组织没有任何影响——这是聚集键的工作。请注意不要改变原意。 - marc_s

0

无符号整数,大小取决于您特定的需求


8
除了 SQL Server 不支持无符号数据类型。 - Joe

0

对于32位处理器来说,整型(int)很可能是最高效的处理大小。


1
单词边界与从Int到BigInt的切换所占用的空间相比不那么重要 - 除非您期望行计数达到数十亿,否则请节省行字节并将它们用在其他地方。I/O成本比内存访问昂贵几个数量级。 - stephbu
同意,我只是在添加使用int的另一个原因。 - dkretz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接