sql server数据库中的主键数据类型

时间:2010-05-22 19:19:09

标签: sql sql-server primary-key uniqueidentifier

我在安装asp.net成员资格表后看到,他们对所有主键字段使用数据类型“uniqueidentifier”。

我一直在使用“int”数据类型,并在插入时增加1并将列声明为IDENTITY。

使用uniqueIdentifier数据类型与我在新插入时使用int和auto增量的当前模型相比,是否有任何特别的好处?

3 个答案:

答案 0 :(得分:2)

uniqueidenfitier解决了复制问题。表的两个复制版本可以插入具有相同整数值的行,但是如果列的值设置为{{1,则它们不可能使用相同的uniqueidentifier插入}}

答案 1 :(得分:2)

我个人对大多数主键和群集键使用INT IDENTITY。我认为微软选择在他们的ASP.NET成员资格表中使用Uniqueidentifier是相当不幸的 - 很多人把这个数据库作为其他人的“模板”......

您需要将主键分开,这是一个逻辑构造 - 它唯一标识您的行,它必须是唯一且稳定且非NULL。 GUID也适用于主键 - 因为它保证是唯一的。如果使用SQL Server复制,GUID作为主键是一个不错的选择,因为在这种情况下,无论如何都需要唯一标识的GUID列。

SQL Server中的集群密钥是一个物理结构,用于数据的物理排序,并且更难以正确使用。通常情况下,SQL Server上的索引女王Kimberly Tripp也需要一个好的聚类密钥,它是唯一的,稳定的,尽可能窄的,并且理想情况下不断增加(这是一个INT IDENTITY)。

请参阅她关于索引的文章:

还可以看到Jimmy Nilsson的The Cost of GUIDs as Primary Key

GUID对于群集密钥来说是一个非常糟糕的选择,因为它很宽,完全随机,因此导致错误的索引碎片和糟糕的性能。此外,群集密钥行也存储在每个非群集(附加)索引的每个条目中,因此您确实希望保持较小 - GUID为16字节,而INT为4字节,并且有几个非聚集索引和几百万行,这会产生巨大的差异。

在SQL Server中,您的主键默认情况下是您的群集密钥 - 但它不一定是。您可以轻松地将GUID用作NON-Clustered主键,并使用INT IDENTITY作为您的群集密钥 - 只需要了解它就可以了。

答案 2 :(得分:1)

  

我一直在使用“int”数据类型,并在插入时按1递增。

在SQL Server中,获取自动递增列的方法是使用IDENTITY。我不确定这是不是你的意思,所以我想我会澄清这个以防万一。

INT列与IDENTITY一起使用的优点是它更小,因此连接速度会稍快一些。但对于大多数用途来说,这不会是一个重大改进。您还应该首先考虑其他事项,例如为表格选择正确的索引。