如果同一台计算机上的2个不同数据库运行NEWID(),
是否保证永远不会发生冲突?
答案 0 :(得分:5)
从统计上来说,它足够独特。在你发生碰撞之前,世界将会结束。
在大多数复制方案中,GUID是必需的,其中许多计算机相互发送数据:如果没有GUID,则无法设置复制。因此,在许多机器上使用它当然是安全的
答案 1 :(得分:2)
NEWID()
值是随机生成的。虽然从统计上来说,NEWID()
返回的值可能会发生成功,但基于所有机器在全球范围内生成值,您需要担心更多可能性事件,例如整个服务器自发燃烧。
在一台Windows机器上,只有一个Windows函数负责通过NEWID()
函数可用的值,并且连续产生两个相同值的可能性比任何两台随机机器都要少。 - 因此概率较低,同一台机器上不同数据库上的两次调用将产生相同的值。
答案 2 :(得分:1)
NEWID()是SQL Server中的唯一定义符,它是16字节的GUID。
请参阅 http://msdn.microsoft.com/en-us/library/ms187942.aspx 和 http://en.wikipedia.org/wiki/Globally_unique_identifier
答案 3 :(得分:1)
我的理解(虽然我无法验证)NEWID()使用RPC UUIDCreate生成从机器的MAC地址,随机数和日期和时间戳派生的唯一GUID。此外,UUIDCreate专门设计用于为每个呼叫返回唯一ID。我还没有遇到任何问题。由于许多功能(包括Active Directory)非常依赖于唯一的GUID,因此我确信Microsoft确保此方法确实可以跨机器生成唯一标识符。我知道的唯一风险是有两台机器具有相同的MAC地址。也许有人可以找到定义算法的特定文档。
答案 4 :(得分:0)
NEWID对您的机器来说是独一无二的,但不一定对所有机器都是唯一的。
答案 5 :(得分:0)
NEWID()
是SQL Server中的一个非确定性函数,它返回类型uniqueidentifier
的唯一值。 MSDN文档明确声明:“返回唯一值”。
你可以像这样使用它:
DECLARE @foo uniqueidentifier = NEWID();
SELECT @foo;
您还可以将其用作表格中的默认列值。
CREATE TABLE [dbo].[TestTable](
[ID] [uniqueidentifier] NOT NULL DEFAULT newid(),
)
服务器在2+数据库上生成相同GUID的可能性非常小。太担心了。要探索/测试/确认这一点,您必须分析NEWID()
实施。