Sql server SQL Server如何使用NEWID()创建唯一标识符

Sql server SQL Server如何使用NEWID()创建唯一标识符,sql-server,Sql Server,我在五个不同的位置有一个user\u info表。现在我需要将所有行集成到一个中央user\u info表中。为此,我需要为源表中的每一行提供一个唯一的id。因为当所有行进入中心表时,每个用户都必须有一个唯一的ID 现在我的问题是: 如果我对每个源表使用uniqueidentifierNEWID(),那么它在全局和生命周期内是唯一的还是有可能重复 SQL Server如何创建NEWID()?我需要知道密钥生成结构 是的,机器之间没有复制的机会 NEWID()基于伪随机数(来自时钟)和主NIC的M

我在五个不同的位置有一个
user\u info
表。现在我需要将所有行集成到一个中央
user\u info
表中。为此,我需要为源表中的每一行提供一个唯一的id。因为当所有行进入中心表时,每个用户都必须有一个唯一的ID

现在我的问题是:

  • 如果我对每个源表使用
    uniqueidentifier
    NEWID()
    ,那么它在全局和生命周期内是唯一的还是有可能重复

  • SQL Server如何创建
    NEWID()
    ?我需要知道密钥生成结构


  • 是的,机器之间没有复制的机会

    NEWID()
    基于伪随机数(来自时钟)和主NIC的MAC地址的组合


    然而,在表上插入这样的随机数作为聚集键对性能来说是非常糟糕的。您应该考虑“<代码> NeXStRealIdId())/代码>或一个用于生成GUID的梳状函数,它仍然提供“代码> NEWID()/代码>的冲突避免益处,同时仍然保持可接受的<代码>插入< /代码>性能.< /P>关于Windows API调用SQL Server调用<代码> NeWID</代码>的任何文档?我知道
    NEWSEQUENTIALID
    按原样使用MAC地址,但看不到任何有关NEWID的文档。
    CoCreateGuid
    最有可能是什么?Eric Lippert有一篇关于GUI的[博客文章系列][1]。另请参见:对于
    NEWID()
    第三部分的第一个十六进制数字总是4(当我尝试它时),对于
    NEWSEQUENTIALID()
    它使用上述MAC地址。我记不起当计算机中没有MAC地址时会发生什么-有人知道SQL在这种情况下会发生什么吗?[1] :newid()使用的时间有多精确?听起来,如果我同时获取两个ID,我应该会得到一个重复的ID,但我从未见过这种情况发生。@tublius,newid()值基于时钟和其他因素生成的伪随机数。这不是时钟值本身,所以复制的机会非常小,甚至不值得担心。如果希望将时间戳显式构建到值中(使其大致按顺序排序,而不存在newsequentiaid()的缺点),则需要一个COMB库。我在Github/Nuget上有一个开源的(RT.Comb)。@richardtallent不,您应该提到有一个可以忽略不计的变化。说没有变化意味着概率为零,这显然不是!