我需要能够为250万条记录生成非重复的8个字符的随机字母数字

时间:2019-03-16 12:56:04

标签: sql sql-server

我需要能够在具有近250万条记录的表上每行应用唯一的8个字符串。

我已经尝试过了:

UPDATE MyTable 
    SET [UniqueID]=SUBSTRING(CONVERT(varchar(255), NEWID()), 1, 8)

可以使用,但是当我检查ID的唯一性时,会收到重复的邮件

SELECT [UniqueID], COUNT([UniqueID]) 
FROM NicoleW_CQ_2019_Audi_CR_Always_On_2019_T1_EM
GROUP BY [UniqueID]
HAVING COUNT([UniqueID]) > 1

如果可能的话,我真的很想更新表格,如上所示。

3 个答案:

答案 0 :(得分:2)

您能只使用数字并分配一个随机值吗?

with toupdate as (
      select t.*,
             row_number() over (order by newid()) as random_enough
      from mytable t
     )
update toupdate
    set UniqueID = right(concat('00000000', random_enough), 8);

答案 1 :(得分:2)

这是一种使用临时表来确保唯一性的方法

使用唯一的随机8个字符代码创建并填充#temporary表。

下面的SQL使用FOR XML技巧在BASE62中生成代码:[A-Za-z0-9]

Examples : 8Phs7ZYl, ugCKtPqT, U9soG39q

GUID仅使用字符[0-9A-F]
对于8个可以生成16 ^ 8 = 4294967296组合的字符。
而使用BASE62时,有62 ^ 8 = 2.183401056e014个组合。
因此,使用BASE62生成重复项的几率大大降低。

临时表的记录量应等于目标表的记录量。
本示例仅生成100000码。但是你明白了。

IF OBJECT_ID('tempdb..#tmpRandoms') IS NOT NULL DROP TABLE #tmpRandoms;
CREATE TABLE #tmpRandoms (
    ID INT PRIMARY KEY IDENTITY(1,1), 
    [UniqueID] varchar(8),
    CONSTRAINT UC_tmpRandoms_UniqueID UNIQUE ([UniqueID])
);

WITH DIGITS AS
(  
    select n 
    from (values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) v(n)
),
NUMS AS
(
    select (d5.n*10000 + d4.n*1000 + d3.n*100 + d2.n * 10 + d1.n) as n
    from DIGITS d1
    cross join DIGITS d2
    cross join DIGITS d3
    cross join DIGITS d4
    cross join DIGITS d5
)
INSERT INTO #tmpRandoms ([UniqueID])
SELECT DISTINCT LEFT(REPLACE(REPLACE((select CAST(NEWID() as varbinary(16)), n FOR XML PATH(''), BINARY BASE64),'+',''),'/',''), 8) AS [UniqueID]
FROM NUMS;

然后用它更新表格

WITH CTE AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY ID) AS RN, [UniqueID]
    FROM YourTable
)
UPDATE t 
SET t.[UniqueID] = tmp.[UniqueID]
FROM CTE t
JOIN #tmpRandoms tmp ON tmp.ID = t.RN;

妊娠here

的测试

答案 2 :(得分:-2)