MSSQL 构建自动增长序列号的新模式

什么是自动增长序列号?

在MSSQL数据库中,自动增长序列号是一种用于生成数据库主键值的技术。这个功能非常适用于需要自动产生一个ID号作为唯一标识的表格,比如说订单编号、用户ID等等。

传统的实现方式

不足之处

传统的实现方式是在建表时,定义一个自增长键,然后在每次插入数据时,自动为该键赋值。但是,这种方式存在一些缺陷:

键值容易发生冲突。如果表中存在多个自增长键,很可能会导致不同记录之间的键值冲突,从而导致在查询或者删除记录时出现问题。此时就需要开发者编写一些复杂的算法来避免这些冲突。

不支持非数字类型的键值。传统的自增长键只能是数字型,非数字型的主键无法实现自动增长。

无法支持外部插入。在一些特殊情况下,需要外部插入记录并指定主键值,此时就无法使用自增长键。

示例代码

CREATE TABLE dbo.Orders

(

OrderId int IDENTITY(1,1) PRIMARY KEY,

OrderDate datetime NOT NULL,

CustomerId int NOT NULL,

...

)

新的模式

优势

为了解决传统方式的问题,MSSQL数据库在2012版本中引入了一个新的功能:序列号。这个新功能允许我们定义一个全局的序列对象,以便用于生成所需的序列值。

它相较于传统方式的优点在于:

支持更为复杂的键值类型。序列对象的键值类型可以是数字型,也可以是字符型、日期型等任何类型。

全局可用。序列对象是全局可用的,因此,如果多个表需要使用相同的自动增长编号,这个编号可以在整个数据库中被共享。

支持定制化。序列对象允许我们定义每个序列的特性,例如起始值、步长、缓存大小等等。

示例代码

下面是一个创建序列对象的基本语法:

CREATE SEQUENCE [schema_name . ] sequence_name

[ AS [ built_in_integer_type | user-defined_integer_type ] ]

[ START WITH start_value ]

[ INCREMENT BY increment_value ]

[ MAXVALUE maximum_value ]

[ MINVALUE minimum_value ]

[ CYCLE | NO CYCLE ]

[ CACHE cache_size ]

[ ]

其中,

sequence_name:序列对象的名称。

built_in_integer_typeuser-defined_integer_type:序列对象的键值类型。如果不指定类型,则默认是64位整型。

start_value:序列对象的初始值。默认是1。

increment_value:序列对象的步长,默认是1。

maximum_value:序列对象的最大值。默认是9223372036854775807 (64位整型的最大值)。

minimum_value:序列对象的最小值。默认是-9223372036854775808 (64位整型的最小值)。

CYCLENO CYCLE:如果序列对象到达最大值时,是否循环回到最小值重新开始。如果指定CYCLE,则从最小值继续递增。默认是不循环。

cache_size:缓存下一序列值的数目。如果不指定,则每次调用 NEXT VALUE FOR 时,都会从表中查询数据获取下一序列号。

下面是一个创建序列对象、使用SERIAL序列获取序列号的实例 SQL 代码:

CREATE SEQUENCE dbo.OrderSequence

START WITH 1000 -- Starting value

INCREMENT BY 1; -- Increment value

DECLARE @newID int;

SET @newID = NEXT VALUE FOR dbo.OrderSequence;

INSERT INTO dbo.Orders (OrderId, OrderDate, CustomerId, ...)

VALUES (@newID, GETDATE(), 1234, ...);

-- Store the new OrderId somewhere; use it to insert to another table,

-- pass it back to the application, or whatever.

-- INSERT INTO [other_table] (OrderId, ...)

-- VALUES (@newID, ...);

结论

在一些特殊的场景下,使用新的序列号特性能够为开发者提供更为灵活、可定制化的自动增长键方式,降低系统开发的复杂度,并且在数据插入过程中起到了不小的帮助。

数据库标签