You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需使用NEWID()生成20位固定长度唯一ID的方案咨询

20位固定长度唯一ID生成方案

针对你需要固定20位唯一ID、避免同一微秒重复的需求,以下是几种可行的SQL实现方案:

方案一:时间戳+自增计数器(高并发场景)

通过辅助表记录当前时间戳的生成计数,确保同一毫秒内生成的ID唯一,总长度20位(17位毫秒级时间戳 + 3位计数器)。

  1. 先创建辅助表:
CREATE TABLE IDGenerator (
    CurrentTimeStamp CHAR(17) PRIMARY KEY,
    Counter INT DEFAULT 0
)
  1. 创建生成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
  1. 使用方式:
SELECT dbo.Generate20BitID() AS Unique20BitID

方案二:时间戳+序列对象(简洁全局唯一)

利用SQL Server的SEQUENCE对象生成自增序列,结合秒级时间戳拼接成20位ID(14位秒级时间戳 + 6位序列值),序列循环后因时间戳变化不会重复。

  1. 创建序列:
CREATE SEQUENCE IDSequence
    START WITH 1
    INCREMENT BY 1
    MINVALUE 1
    MAXVALUE 999999
    CYCLE -- 序列到999999后自动重置为1
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 09:16:16