016 数据库学习笔记--序列

发布时间 2023-06-15 14:31:27作者: sunwugang

序列:获取唯一值,序列不支持事务回滚,会出现跳号

SQLServer 序列是一种逐步增加的命名的唯一的索引,它可以将一个整数标示符与一个数据行关联起来,并可保证该索引特别唯一。

凭借这一特性,序列对于对数据进行安全且按照某种有意义的排序进行保存的场景非常有用。

序列是一种用户定义的架构绑定对象,它根据创建该序列时采用的规范生成一组数值。 这组数值以定义的间隔按升序或降序生成,并且可根据要求循环(重复)

  • 序列不与表相关联,这一点与标识列不同。

  • 应用程序将引用某一序列对象以便接收其下一个值。

  • 序列是通过使用 CREATE SEQUENCE 语句独立于表来创建的。 其选项使您可以控制增量、最大值和最小值、起始点、自动重新开始功能和缓存以便改进性能。

  • 与在插入行时生成的标识列值不同,应用程序可以通过调用 NEXT VALUE FOR 函数在插入行之前获取下一序列号。 在调用 NEXT VALUE FOR 时分配该序列号,即使在该序列号永远也不插入某个表中时也是如此。 此 NEXT VALUE FOR 函数可用作表定义中某个列的默认值。

  • 使用 sp_sequence_get_range 可一次获取某个范围的多个序列号。

  • 序列可定义为任何整数数据类型。 如tinyint, smallint, int, bigint, decimal 或是小数精度为0的数值类型。如果未指定数据类型,则序列将默认为 bigint

序列的限制(limitation)有二个:

  • 序列不支持事务,即使事务中进行了回滚(rollback)操作,序列仍然返回下一个元素。

  • 序列不支持SQL Server 复制(replication),序列不会复制到订阅的SQL Server实例中。如果一个表的默认值依赖一个序列,而序列又是不可复制的,这会导致订阅的SQL Server出现脚本错误。

示例:

--删除序列
drop sequence GetOrderNOBySequence 
go
--创建序列 ,常用于确保数据列中的数据唯一,例如检查号、影像号、申请单号...
CREATE sequence GetOrderNOBySequence 
START WITH 1  --起始值
INCREMENT BY 1 --增长步长
MINVALUE 0  --最小  可省略
MAXVALUE 9999999999--最大 可省略
go
drop sequence GetOrderNOBySequence 
go
/****** Object:  Sequence [dbo].[GetOrderNOBySequence]    Script Date: 2023-06-15 13:56:09 ******/
CREATE SEQUENCE [dbo].[GetOrderNOBySequence] 
 AS [bigint]
 START WITH 1
 INCREMENT BY 1
 MINVALUE 0
 MAXVALUE 9999999999
 CACHE 
GO

--获取序列号
SELECT NEXT VALUE FOR GetOrderNOBySequence as 序列号

--重置序列号从 起始位置开始
ALTER SEQUENCE GetOrderNOBySequence  RESTART WITH 1 

--获取指定序列信息--确认缓存大小并查看当前值
SELECT cache_size, current_value   FROM sys.sequences  WHERE name = 'GetOrderNOBySequence' ;