在SQL Server中有一个类型uniqueidentifier?这是什么?它有什么作用?这和使用主键有什么区别
答案 0 :(得分:4)
这是GUID column。 这意味着每次在此表中插入行时,SQL Server都会生成一个新的GUID并将其放入此列。这样可以确保该值不仅在此计算机上,而且在世界上所有计算机上都是唯一的。
更新:
正如@tdammers在评论部分所指出的那样,插入行时不会自动生成新的GUID,但可以通过将newid()
定义为列的默认值来实现此效果。
答案 1 :(得分:2)
uniqueidentifier
是GUID
的SQL Server名称(请参阅http://en.wikipedia.org/wiki/Globally_unique_identifier)。中心思想是GUID足够大并且具有足够的熵以使得两个随机生成的GUID的冲突极不可能。为了进一步减少冲突的可能性,大多数GUID生成器包括一些在散列过程中唯一标识主机的值,例如主NIC的MAC地址,并维护一个机器范围的计数器以避免在同一台机器上生成的GUID之间发生冲突。
在SQL Server中,uniqueidentifier
只是另一种数据类型,如int
,varchar
等,但其特性使其适合作为主键。它比典型的自动增量整数大得多,但它使复制和迁移变得更加容易 - 如果使用GUID,来自两个以前不相关的数据库的数据不会在主键上产生冲突,因为每个GUID(在概念上)是全局唯一的。使用自动递增主键时,您肯定会出现重叠,因为两个表一旦从1开始,修改主键值意味着您还必须修改引用此记录的任何外键值。它可以完成,但它比简单地使用GUID要困难得多。
答案 2 :(得分:1)
正如你已经提到的那样,其他人也指出 - SQL Server中的GUID / 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作为您的群集密钥 - 只需要了解它就可以了。