简要说明,我正在从头开始构建一个包含数据库的VB.NET程序。因此,我需要为每个表设置唯一的事务ID,例如header_id
,detail_id
,order_number
以及需要任何运行增量编号的更多内容。我正在从SQL Server 2005升级到SQL Server 2014,以便我可以为正在运行的号码作业内置SEQUENCE
。
我目前的情况(SQL Server 2005,VB.NET)是我使用一个表来存储所有运行号码和一个存储过程来执行我的VB.NET程序中运行的数字。例如,在Sales Order
中,我将硬编码参数传递给存储过程以查找表中的值,然后将数字增加1,然后将其插入Sales Order
表。
在我开始迁移数据库并重新设计表结构之前,我想知道我是否正确启动,这意味着我必须为每个表分配一个特定的序列吗?请指导。
答案 0 :(得分:4)
通常,您不需要SEQUENCE
为单个表生成唯一且不断增加的标识值 。即使使用SQL Server 2005,您也有两个更简单的选项:
定义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将是唯一的(但可能存在间隙)。
使用GUID:
,而不是使用整数IDCREATE 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()
代替。
当然你也可以使用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)
…
);
这样FlowerOrders
和FlowerPotOrders
就不可能包含重叠的OrderId
。