Microsoft SQL Server 2014 序列

Microsoft SQL Server 2014 sequence

简要说明,我正在从头构建一个 VB.NET 程序,包括数据库。因此,我需要为每个 table 设置唯一的交易 ID,例如 header_iddetail_idorder_number,以及更多需要任何 运行 增量编号的交易 ID .我正在从 SQL Server 2005 升级到 SQL Server 2014,这样我就可以为 运行 数字作业提供内置的 SEQUENCE

我目前的情况(SQL Server 2005,VB.NET)是我正在使用一个 table 来存储所有 运行 号码和一个存储过程来执行运行 来自我的 VB.NET 程序的数字。例如在Sales Order中,我会传递一个硬编码的参数给存储过程来查找table中的值,然后将数字增加1,然后将其插入到Sales Order中table.

在我开始迁移数据库并重新设计 table 结构之前,我想知道我的起点是否正确,这意味着我必须为每个 table 分配一个特定的序列为了它?请指导。

通常您不需要 SEQUENCE 来为单个 tables 生成唯一的递增身份值 。即使使用 SQL Server 2005,您也有两个更简单的选择:

  1. 定义一个 IDENTITY 列。例如:

    CREATE TABLE Orders
    (
        OrderId INT IDENTITY(1,1) NOT NULL,
        …        -- ^^^^^^^^^^^^^
    );           -- very much like an unnamed sequence that START WITH 1 INCREMENT BY 1
    

    INSERT-ing 进入这个 table 时,您不需要为 OrderId 指定一个值,它会由 RDBMS 为您选择。生成的 ID 将是唯一的(但可能存在间隙)。

  2. 不使用整数 ID,而是使用 GUID:

    CREATE TABLE Orders
    (
        OrderId UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL DEFAULT (NEWSEQUENTIALID()),
        …
    );
    

    DEFAULT 约束意味着您不必在 INSERT-ing 时显式选择 OrderId 的值; RDBMS 将为您生成一个值。

    P.S.: NEWSEQUENTIALID()确保生成的GUID在稳步增加。如果 GUID 列用于聚类(即当您有 PRIMARY KEY CLUSTERED (OrderId ASC) 约束时),这一点很重要,如 中所述。如果该列不用于聚类并且唯一重要的是 GUID 是唯一的,但不一定是递增的,那么您也可以使用 NEWID() 代替。

当然您也可以使用 SEQUENCE,但这样的解决方案与上述两个(更简单的)解决方案相比没有任何额外好处。当您必须在多个 table 中创建唯一 ID 时,这种情况会发生变化,例如:

CREATE SEQUENCE OrderIds START WITH 1 INCREMENT BY 1;

CREATE TABLE FlowerOrders
(
    OrderId INT NOT NULL DEFAULT (NEXT VALUE FOR OrderIds),
    …
);

CREATE TABLE FlowerPotOrders
(
    OrderId INT NOT NULL DEFAULT (NEXT VALUE FOR OrderIds)
    …
);

这样 FlowerOrdersFlowerPotOrders 就不可能包含重叠的 OrderId