什么是自动增长序列号?
在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_type
或 user-defined_integer_type
:序列对象的键值类型。如果不指定类型,则默认是64位整型。
start_value
:序列对象的初始值。默认是1。
increment_value
:序列对象的步长,默认是1。
maximum_value
:序列对象的最大值。默认是9223372036854775807 (64位整型的最大值)。
minimum_value
:序列对象的最小值。默认是-9223372036854775808 (64位整型的最小值)。
CYCLE
或 NO 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, ...);
结论
在一些特殊的场景下,使用新的序列号特性能够为开发者提供更为灵活、可定制化的自动增长键方式,降低系统开发的复杂度,并且在数据插入过程中起到了不小的帮助。