SQL server中生成唯一数

1. NEWID 函数:生成全局唯一标识符(GUID)

  • 功能:生成一个 128 位的全局唯一标识符(GUID),格式为字符串(如 6F9619FF-8B86-D011-B42D-00C04FC964FF)。
  • 特点
    • 基于算法确保全局唯一性,适用于分布式系统。
    • 无序,可能导致索引碎片化(相比自增整数性能略低)。
  • 示例
    
    
    	
    SELECT NEWID AS UniqueGUID;


2. NEWSEQUENTIALID 函数:有序 GUID

  • 功能:生成一个按时间顺序递增的 GUID,优于 NEWID 的随机性。
  • 特点
    • 减少索引页拆分,提升写入性能(适合高并发场景)。
    • 仅支持在创建表时作为 DEFAULT 约束使用。
  • 示例(表定义):
    
    
    sql
    CREATE TABLE Example (
        ID UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID,
        Data NVARCHAR(100)
    );


3. 序列对象(Sequence):生成全局递增整数

  • 功能:独立于表的全局递增整数生成器,适用于需要有序且唯一数值的场景。
  • 特点
    • 支持多表共享,可配置起始值、步长和循环规则。
    • 需要显式调用 NEXT VALUE FOR 获取值。
  • 示例
    -- 创建序列
    CREATE SEQUENCE GlobalSeq
    AS INT
    START WITH 1
    INCREMENT BY 1;
    
    -- 使用序列
    INSERT INTO Table1 (ID, Data)
    VALUES (NEXT VALUE FOR GlobalSeq, 'Data');

    -- 创建序列 CREATE SEQUENCE GlobalSeq AS INT START WITH 1 INCREMENT BY 1; -- 使用序列 INSERT INTO Table1 (ID, Data) VALUES (NEXT VALUE FOR GlobalSeq, 'Data');


4. CHECKSUM(NEWID) 组合:生成随机整数

  • 功能:通过 GUID 转换生成整型随机数,适用于需要数值型唯一标识符的场景。
  • 特点
    • 结果可能重复(概率极低),需结合 ABS 限制负值。
    • 示例代码:
      
      
      sql
      SELECT ABS(CHECKSUM(NEWID)) AS UniqueInt;

      暗色

      复制

      SELECT ABS(CHECKSUM(NEWID)) AS UniqueInt;


5. 时间戳+随机数组合:自定义唯一值

  • 功能:结合时间戳和随机数生成有序且唯一的数值(如 BIGINT)。
  • 示例
    
    
    sql
    SELECT CAST(CAST(GETDATE AS BINARY(8)) 
                + CAST(RAND(CHECKSUM(NEWID)) * 1000000 AS BINARY(8)) 
                AS BIGINT) AS UniqueTimestampValue;

    暗色

    复制

    SELECT CAST(CAST(GETDATE AS BINARY(8)) + CAST(RAND(CHECKSUM(NEWID)) * 1000000 AS BINARY(8)) AS BIGINT) AS UniqueTimestampValue;


方法对比与选型建议

方法数据类型唯一性保证有序性适用场景
NEWIDGUID全局唯一无序分布式系统、无序唯一标识
NEWSEQUENTIALIDGUID全局唯一有序高并发写入、索引优化
序列对象整数数据库范围内唯一有序多表共享序列、有序主键
CHECKSUM(NEWID)整数高概率唯一无序简单随机数值需求
时间戳+随机数BIGINT高概率唯一半有序需要时间趋势的唯一标识

注意事项

  1. GUID 的存储与性能:GUID 占用 16 字节,比整数(4 字节)更消耗存储和索引性能。
  2. 序列的全局性:序列需手动管理,避免多表冲突(如分库分表需调整步长)。
  3. 分布式系统:若需跨数据库唯一,推荐 GUID 或雪花算法(需自定义实现)。

根据具体需求选择方法:若需简单唯一性用 NEWID;若需有序整数用序列;高并发场景选 NEWSEQUENTIALID

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝈蝈(GuoGuo)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值