无需使用NEWID()生成20位固定长度唯一ID的方案咨询
20位固定长度唯一ID生成方案
针对你需要固定20位唯一ID、避免同一微秒重复的需求,以下是几种可行的SQL实现方案:
方案一:时间戳+自增计数器(高并发场景)
通过辅助表记录当前时间戳的生成计数,确保同一毫秒内生成的ID唯一,总长度20位(17位毫秒级时间戳 + 3位计数器)。
- 先创建辅助表:
CREATE TABLE IDGenerator ( CurrentTimeStamp CHAR(17) PRIMARY KEY, Counter INT DEFAULT 0 )
- 创建生成ID的函数:
CREATE FUNCTION Generate20BitID() RETURNS CHAR(20) AS BEGIN DECLARE @TimeStamp CHAR(17) = FORMAT(SYSDATETIME(), 'yyyyMMddHHmmssfff') DECLARE @Counter INT DECLARE @ID CHAR(20) BEGIN TRANSACTION -- 尝试更新当前时间戳的计数器 UPDATE IDGenerator SET Counter = Counter + 1, @Counter = Counter + 1 WHERE CurrentTimeStamp = @TimeStamp -- 如果是该时间戳第一次生成ID,插入新记录 IF @@ROWCOUNT = 0 BEGIN INSERT INTO IDGenerator (CurrentTimeStamp, Counter) VALUES (@TimeStamp, 1) SET @Counter = 1 END COMMIT TRANSACTION -- 拼接时间戳和补零后的计数器,确保总长度20位 SET @ID = @TimeStamp + RIGHT('000' + CAST(@Counter AS VARCHAR(3)), 3) RETURN @ID END
- 使用方式:
SELECT dbo.Generate20BitID() AS Unique20BitID
方案二:时间戳+序列对象(简洁全局唯一)
利用SQL Server的SEQUENCE对象生成自增序列,结合秒级时间戳拼接成20位ID(14位秒级时间戳 + 6位序列值),序列循环后因时间戳变化不会重复。
- 创建序列:
CREATE SEQUENCE IDSequence START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 999999 CYCLE -- 序列到999999后自动重置为1
- 生成ID:
SELECT FORMAT(SYSDATETIME(), 'yyyyMMddHHmmss') + RIGHT('000000' + CAST(NEXT VALUE FOR IDSequence AS VARCHAR(6)), 6) AS Unique20BitID
方案三:时间戳+NEWID片段(低并发快速实现)
结合百分之一秒级时间戳和NEWID的部分字符,利用NEWID的随机性降低同一时间片段内的重复概率,总长度20位(16位时间戳 + 4位NEWID字符)。
生成ID的直接语句:
SELECT FORMAT(SYSDATETIME(), 'yyyyMMddHHmmssff') + LEFT(REPLACE(NEWID(), '-', ''), 4) AS Unique20BitID
内容的提问来源于stack exchange,提问作者my activites
相关产品推荐
相关产品推荐

