NEWID() 是 SQL Server 中用于生成全局唯一标识符(GUID) 的系统函数-SQL Server服务中心-电脑网络-本牛千智丨专注WorkFine开发

NEWID() 是 SQL Server 中用于生成全局唯一标识符(GUID) 的系统函数

介绍

NEWID() 是 SQL Server 中用于生成全局唯一标识符(GUID) 的系统函数。

  • 返回值类型UNIQUEIDENTIFIER
  • 格式示例6F9619FF-8B86-D011-B42D-00C04FC964FF(36个字符,含4个连字符)
  • 核心特点
  • 基于网卡MAC地址、时间戳等生成,理论上全球唯一
  • 随机性强,值不可推测
  • 无顺序性(无序GUID),不适合作为聚集索引键(会导致频繁页分裂)
  • 主要用途
  • 作为分布式系统的主键
  • 生成随机排序(ORDER BY NEWID()
  • 随机抽样
  • 简单用法
  SELECT NEWID();               -- 直接生成一个GUID
  CREATE TABLE T (ID UNIQUEIDENTIFIER DEFAULT NEWID());

💡 如需有序GUID(利于索引),可用 NEWSEQUENTIALID()

案例

1. 为表中的每一行生成随机排序

-- 按随机顺序返回员工列表
SELECT 
    [员工编号], 
    [名字], 
    [姓氏]
FROM 
    [员工表]
ORDER BY 
    NEWID();

2. 从表中随机抽取指定数量的行

-- 随机抽取 10 个订单
SELECT TOP 10 
    [订单编号], 
    [客户编号], 
    [订单日期]
FROM 
    [订单表]
ORDER BY 
    NEWID();

-- 随机抽取 5% 的产品
SELECT TOP 5 PERCENT 
    [产品编号], 
    [产品名称]
FROM 
    [产品表]
ORDER BY 
    NEWID();

3. 插入数据时自动生成唯一标识符

-- 创建表时将 [用户标识] 默认值设为 NEWID()
CREATE TABLE [用户表] (
    [用户标识] UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY,
    [用户名] NVARCHAR(100)
);

-- 插入时无需指定 [用户标识]
INSERT INTO [用户表] ([用户名]) VALUES ('张三'), ('李四');

-- 插入时显式生成
INSERT INTO [用户表] ([用户标识], [用户名])
VALUES (NEWID(), '王五');

4. 使用 NEWID() 配合 CHECKSUM 生成随机整数

-- 生成 1 到 100 之间的随机整数
SELECT 
    ABS(CHECKSUM(NEWID())) % 100 + 1 AS [随机数字];

-- 为表中的每行生成一个 1~100 的随机分数
SELECT 
    [产品编号],
    [产品名称],
    ABS(CHECKSUM(NEWID())) % 100 + 1 AS [随机分数]
FROM 
    [产品表];

5. 更新现有表中的 GUID 列

-- 为没有 GUID 的记录生成唯一值
UPDATE [产品表]
SET [产品全局标识] = NEWID()
WHERE [产品全局标识] IS NULL;

6. 在查询中生成临时唯一标识

-- 为查询结果额外增加一列随机唯一值
SELECT 
    [客户编号],
    [公司名称],
    NEWID() AS [临时行标识]
FROM 
    [客户表];

7. 与 ROW_NUMBER() 结合生成自增序号 + 随机标识

SELECT 
    ROW_NUMBER() OVER (ORDER BY [客户编号]) AS [序号],
    NEWID() AS [随机GUID],
    [客户名称]
FROM 
    [客户表];

📌 使用中文命名时的注意事项

  • 必须使用方括号 [] 包裹中文表名或字段名,否则 SQL Server 会报语法错误。
  • 如果不加括号,也可用双引号(需设置 QUOTED_IDENTIFIER ON),但方括号是 SQL Server 的标准做法。
  • 示例中的表名(如 [员工表])及字段名可根据您实际的数据库对象名称进行替换。

相关文章

请登录后发表评论

    请登录后查看回复内容