2011-07-20 31 views
0

如果2 不同数据库运行NEWID(),如果同一台机器上有两个不同的数据库运行NEWID(),是否保证永远不会有冲突?在同一台机器上

它是保证永远不会有冲突?

+0

我认为你需要在这里得到更多的细节。我假设你正在谈论MS SQL Server,但尚不清楚。另外它通常有助于发布一些代码,以便用户可以了解您正在讨论的背景。 – bittersweetryan

+0

是的,我的意思是mssql服务器 – Gerray

回答

0

NEWID将是唯一为您的机器,但不一定是唯一到处所有机器。

+0

如果2 **不同的**数据库在同一台机器上运行NEWID(), 是否保证永远不会有冲突? – Gerray

+0

期望这是安全的。 – cwallenpoole

0

NEWID()是SQL Server中的一个非确定性函数,它返回类型为uniqueidentifier的唯一值。 MSDN文档明确指出:“返回一个唯一值”。

您可以使用它像这样:

DECLARE @foo uniqueidentifier = NEWID(); 
SELECT @foo; 

您也可以使用它作为一个表中的默认列值。

CREATE TABLE [dbo].[TestTable](
    [ID] [uniqueidentifier] NOT NULL DEFAULT newid(), 
)  

服务器在两个数据库上生成相同GUID的机会非常小。太小,不用担心。为了探索/测试/确认这一点,你必须分析NEWID()的实现。

5

它在统计学上足够独特。在发生碰撞之前,世界将会结束。

在大多数机器互相发送数据的大多数复制方案中,GUID是必需的:不能在没有GUID的情况下设置复制。所以当然可以在很多机器上使用

2

NEWID()值是随机生成的。虽然从统计学角度而言,机会NEWID()返回的值可能会发生冲突,根据全部机器在全球范围内生成值,但您需要担心更多可能发生的事件,例如整个服务器自发燃烧。


在一台Windows机器,有一个单一的Windows功能负责其成为可通过NEWID()函数的值,它甚至不太可能产生连续两个相同的值比任何两个随机机这样做 - 所以概率是,低于,在同一台机器上的两个不同数据库上的调用将产生相同的值。

1

这是我的理解(虽然我无法验证)NEWID()使用RPC UUIDCreate生成从机器的MAC地址,随机数和日期和时间戳得出的唯一GUID。另外UUIDCreate专门为每个呼叫返回一个唯一的ID。我还没有遇到任何问题。由于包括Active Directory在内的许多功能都非常依赖于唯一的GUID,因此我相当肯定Microsoft确保此方法确实能够跨机器生成唯一的标识符。我知道的唯一风险是当两台机器具有相同的MAC地址时。也许有人可以找到定义算法的特定文档。

相关问题