1. NEWID
函数:生成全局唯一标识符(GUID)
- 功能:生成一个 128 位的全局唯一标识符(GUID),格式为字符串(如
6F9619FF-8B86-D011-B42D-00C04FC964FF
)。 - 特点:
- 基于算法确保全局唯一性,适用于分布式系统。
- 无序,可能导致索引碎片化(相比自增整数性能略低)。
- 示例:
SELECT NEWID AS UniqueGUID;
2. NEWSEQUENTIALID
函数:有序 GUID
- 功能:生成一个按时间顺序递增的 GUID,优于
NEWID
的随机性。 - 特点:
- 减少索引页拆分,提升写入性能(适合高并发场景)。
- 仅支持在创建表时作为
DEFAULT
约束使用。
- 示例(表定义):
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
限制负值。 - 示例代码:
SELECT ABS(CHECKSUM(NEWID)) AS UniqueInt;
暗色
复制
SELECT ABS(CHECKSUM(NEWID)) AS UniqueInt;
- 结果可能重复(概率极低),需结合
5. 时间戳+随机数组合:自定义唯一值
- 功能:结合时间戳和随机数生成有序且唯一的数值(如
BIGINT
)。 - 示例:
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;
方法对比与选型建议
方法 | 数据类型 | 唯一性保证 | 有序性 | 适用场景 |
---|---|---|---|---|
NEWID | GUID | 全局唯一 | 无序 | 分布式系统、无序唯一标识 |
NEWSEQUENTIALID | GUID | 全局唯一 | 有序 | 高并发写入、索引优化 |
序列对象 | 整数 | 数据库范围内唯一 | 有序 | 多表共享序列、有序主键 |
CHECKSUM(NEWID) | 整数 | 高概率唯一 | 无序 | 简单随机数值需求 |
时间戳+随机数 | BIGINT | 高概率唯一 | 半有序 | 需要时间趋势的唯一标识 |
注意事项
- GUID 的存储与性能:GUID 占用 16 字节,比整数(4 字节)更消耗存储和索引性能。
- 序列的全局性:序列需手动管理,避免多表冲突(如分库分表需调整步长)。
- 分布式系统:若需跨数据库唯一,推荐 GUID 或雪花算法(需自定义实现)。
根据具体需求选择方法:若需简单唯一性用 NEWID
;若需有序整数用序列;高并发场景选 NEWSEQUENTIALID
。