sql - 生成唯一的字母数字 ID

标签 sql sql-server t-sql

我的想法是为我的表生成一个唯一的 ID,为 SQL Server 中的我的表生成一个唯一的字母数字 ID,因此我使用 Newid 函数来执行此操作,然后将结果截断为 8 个字符。我的问题是用这个代码我确定有一个唯一的ID吗?或者也许不是这里的代码:

DECLARE @r varchar(8) 

SELECT @r = coalesce(@r, '') + n 
FROM (SELECT top 8 CHAR(number) n 
   FROM master..spt_values 
   WHERE type = 'P' AND 
      (number between ascii(0) and ascii(9) 
         OR number between ascii('A') and ascii('Z') 
         OR number between ascii('a') and ascii('z')) 
   ORDER BY newid()) a 

DECLARE @id varchar(10)  
SET @id=CONVERT(varchar(8), @r)  
DECLARE @myid varchar(10) 

SELECT @myid=SUBSTRING(@r,1,2)+'-'+SUBSTRING(@r,3,3)+'-'+SUBSTRING(@r,6,3)  

PRINT 'Value of @myid is: '+ @myid

最佳答案

NEWID() 生成 v4 GUID。在该 GUID 方案中,前 8 个字节可以是任何十六进制数字 0-F,并且完全由随机生成的数据组成。这并不能保证是唯一的;事实上,没有任何 v4 GUID 能保证是唯一的,只是随机位(128 中的 112)可以表示 5.19 个十亿数字之一,因此其中任意两个在同一系统中匹配的几率是无穷小。仅使用前 8 个字节,您将只有 2^32 个组合,这可能看起来仍然很多(40 亿分之一),但由于生日问题,在生成了很少的 77,000 个之后,您就有了 50-50 的机会在生成副本时。

关于sql - 生成唯一的字母数字 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12467833/

相关文章:

sql - 使用 t-sql 按升序获取最后 3 行?

mysql - 如何让用户只能查看表中的某些行

sql-server - 如何在 SQL Server 中调试合并?

sql-server - 为父子关系定义自定义删除规则

java - SQLServer : Search where on uniqueidentifier guid

sql-server - 为什么这些 SQL Server 查询会产生不同的结果?

SQL Server 表转 json

sql - 如何计算 NHibernate 中属于多个标签的所有帖子?

sql - MySQL:选择出现的一行,然后将结果与另一个查询结合起来

sql - 将列拆分为三列的新行