我需要能够在具有近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
如果可能的话,我真的很想更新表格,如上所示。
答案 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)
更改:声明@s char(5)和SELECT TOP(5)c1以固定所需的长度。