不使用newid()函数创建20位unqueid

问题描述 投票:0回答:2

我想创建一个 UniqueId 生成器,就像

NEWID()
一样,因为它有助于创建 32 位唯一数字。

这里我不想使用

NEWID()
,因为我需要20位数字的固定长度,一旦有机会创建重复的可能性最高。这将导致应用程序转储。

帮助我了解创建唯一 ID 列表的可能方法。

SELECT LEN((REPLACE(REPLACE(REPLACE(FORMAT(SYSDATETIME(), 'yyyyMMddHHmmss.ffffff'), '-', ''), ':', ''), '.', ''))),

(REPLACE(REPLACE(REPLACE(FORMAT(SYSDATETIME(), 'yyyyMMddHHmmssfff'), '-', ''), ':', ''), '.', ''))

这不会起作用,因为多次运行该语句会给出相同的输出。因为它是在同一微秒内执行的。 'ff'.

sql sql-server
2个回答
0
投票

为什么不结合这两种方法呢?使用基于 NEWID() 字段中 5 位数字的日期的部分构造的唯一标识符?我认为 0.003 秒内重复的可能性几乎为零。

SELECT FORMAT(SYSDATETIME(), 'yyMMddHHmmssfff')+LEFT(NEWID(),5) AS UniqID

0
投票

如果您想要/需要 20 位唯一标识符,您可以使用 序列

create sequence dbo.mySeq
    as numeric(20, 0)
    start with 1
    no cycle
    cache 100;

它是数据库中的一个适当的对象,可以在一个或多个表的列的默认约束中使用。


也就是说,我质疑您一般不想使用 GUID 的理由(其中

NEWID()
只是获取 GUID 的一种方法)。首先,你获得重复的可能性极小。但假设您确实得到了一个副本。这不一定是应用程序崩溃。当然,无论您拥有什么应用程序端代码,都有错误处理的概念,对吗?处理重复键错误并也许再次尝试插入?

另请注意,20 位 ID 空间比 GUID 空间小得多。虽然是学术性的(即表中不可能有 10^20 行),但 10^20 = log_2 (10^20) = 20 * log_2 10 ≈ 66 位中的位数约为 128 位的一半GUID 中的位。

© www.soinside.com 2019 - 2024. All rights reserved.