Microsoft SQL Server 2014序列

时间:2015-07-13 05:35:07

标签: sql-server sql-server-2014

简要说明,我正在从头开始构建一个包含数据库的VB.NET程序。因此,我需要为每个表设置唯一的事务ID,例如header_iddetail_idorder_number以及需要任何运行增量编号的更多内容。我正在从SQL Server 2005升级到SQL Server 2014,以便我可以为正在运行的号码作业内置SEQUENCE

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

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

1 个答案:

答案 0 :(得分:4)

通常,您不需要SEQUENCE为单个表生成唯一且不断增加的标识值 。即使使用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进入此表时,您不需要为OrderId指定值,RDBMS将为您选择它。生成的ID将是唯一的(但可能存在间隙)。

  2. 使用GUID:

    ,而不是使用整数ID
    CREATE TABLE Orders
    (
        OrderId UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL DEFAULT (NEWSEQUENTIALID()),
        …
    );
    

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

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

  3. 当然你也可以使用SEQUENCE,但这样的一个没有比上面两个(更简单的)解决方案更多的好处。当您必须在多个表中创建唯一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