这是一种使用临时表来保证唯一性的方法
使用唯一的随机 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;
对 rextester here
的测试