SQL Server NEWSEQUENTIALID() 函数使用指南

在 SQL Server 中,NEWSEQUENTIALID() 函数用于生成一个新的、不重复的 GUID(全局唯一标识符)。与 NEWID() 不同的是,NEWSEQUENTIALID() 函数生成的 GUID 按照顺序递增,并且不会有碰撞,因此可以更高效地用于数据库索引的构建。

语法

NEWSEQUENTIALID() 函数的语法非常简单,如下所示:

NEWSEQUENTIALID()

使用场景

NEWSEQUENTIALID() 函数主要适用于以下场景:

  • 用于数据库表的主键或唯一标识符,可以替代自增长字段。
  • 用于高并发环境下的数据插入操作,可以避免 GUID 的随机性带来的频繁的索引分裂。

示例

示例 1:创建表格并插入数据

下面的示例演示了如何使用 NEWSEQUENTIALID() 函数创建一个名为 Person 的表格,并插入一些样例数据:

CREATE TABLE Person
(
    Id UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID() NOT NULL,
    FirstName VARCHAR(50) NOT NULL,
    LastName VARCHAR(50) NOT NULL,
    Email VARCHAR(50) NOT NULL,
    CONSTRAINT PK_Person PRIMARY KEY CLUSTERED (Id)
);

INSERT INTO Person (FirstName, LastName, Email)
VALUES ('John', 'Doe', '[email protected]'),
       ('Jane', 'Doe', '[email protected]'),
       ('Bob', 'Smith', '[email protected]')

执行上述脚本后,我们可以查看 Person 表格的数据,如下所示:

Id FirstName LastName Email
A7A0738E-2B7C-EA11-BEE7-0050568D58E7 John Doe [email protected]
A8A0738E-2B7C-EA11-BEE7-0050568D58E7 Jane Doe [email protected]
A9A0738E-2B7C-EA11-BEE7-0050568D58E7 Bob Smith [email protected]

可以看到,每个插入的记录都使用了 NEWSEQUENTIALID() 函数生成的 GUID 作为主键。

示例 2:使用 NEWSEQUENTIALID() 作为主键

如果您需要为表格生成一个唯一的主键,并且希望按时间顺序插入记录,那么 NEWSEQUENTIALID() 函数非常适合。下面是一个示例,展示如何创建一个具有唯一主键的表格,并使用 NEWSEQUENTIALID() 函数插入记录:

CREATE TABLE Employee (
   EmployeeID uniqueidentifier DEFAULT NEWSEQUENTIALID(),
   FirstName varchar(50),
   LastName varchar(50),
   Email varchar(50),
   HireDate date
);

INSERT INTO Employee (FirstName, LastName, Email, HireDate)
VALUES ('John', 'Doe', '[email protected]', '2022-01-01'),
       ('Jane', 'Doe', '[email protected]', '2022-01-15'),
       ('Bob', 'Smith', '[email protected]', '2022-02-01');

在这个示例中,我们创建了一个名为 Employee 的表格,并使用 NEWSEQUENTIALID() 函数为 EmployeeID 列生成唯一的主键。在插入记录时,我们没有为 EmployeeID 列指定任何值,因为它会自动使用 NEWSEQUENTIALID() 函数生成唯一值。在查询 Employee 表格时,您会注意到 EmployeeID 列的值是按时间顺序排序的。

结论

NEWSEQUENTIALID() 函数是一个非常有用的函数,它可以为您的表格生成唯一的、按时间顺序排序的 GUID 值。这使得 NEWSEQUENTIALID() 函数非常适合用作主键,特别是在具有高写入负载的情况下。但请注意,NEWSEQUENTIALID() 函数只在 Windows 平台上受支持。如果您需要在非 Windows 平台上使用类似的功能,可以考虑使用其他的 GUID 生成器,例如 UUID-OSSP。