SQL SERVER 2012 SEQUENCE

时间:2017-06-27 00:50:40   收藏:0   阅读:481

一、Sequence简介

Sequence对象对于Oracle用户来说是最熟悉不过的数据库对象了, 在SQL SERVER2012终于也可以看到这个对象了。Sequence是SQL Server2012推出的一个新特性。这个特性允许数据库级别的序列号在多表或多列之间共享。

二、Sequence基本概念

Oracle中有Sequence的功能,SQL server类似的功能要使用identity列实现,但是identity列有很大的局限性。微软终于在2012中添加了Sequence对象。与以往identity列不同的是:Sequence是一个  与架构绑定的数据库级别的对象,而不是与具体的表的具体列所绑定。这就意味着Sequence带来多表之间共享序列号的便利之外,还会带来如下不利影响:

1、与identity列不同的是,Sequence插入表中的序列号可以被Update,除非通过触发器来进行保护

2、与identity列不同,Sequence有肯能插入重复值(Sequence可以设置循环,对于循环的Sequence来说会有重复值)

3、Sequence仅仅负责产生序列号,并不负责控制如何使用序列号,因此当生成一个序列号被Rollback之后,Sequence会继续生成下一个序列号,从而在序列号之间产生间隙

三、Sequence的用法

MSDN上对创建Sequence的语法如下:

CREATE SEQUENCE [schema_name . ] sequence_name  
    [ AS [ built_in_integer_type | user-defined_integer_type ] ]  
    [ START WITH <constant> ]  
    [ INCREMENT BY <constant> ]  
    [ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]  
    [ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]  
    [ CYCLE | { NO CYCLE } ]  
    [ { CACHE [ <constant> ] } | { NO CACHE } ]  
    [ ; ]

 参数:

sequence_name
指定数据库中已知序列的唯一名称。类型是sysname。

[built_in_integer_type | user-defined_integer_type 
可以将序列定义为任何整数类型。允许以下类型。

创建一个简单的序列

1 CREATE sequence Seq_test --序列的名称:Seq_test
2 as bigint --类型
3 start with 100000001 --开始值
4 increment by 1 --步长
5 minvalue 1 --最小值
6 maxvalue 999999999 --最大值
7 no cycle --不循环
8 cache --设置缓冲

2、查询序列

创建了序列之后,可以通过SQL Server 2012新增的视图sys.sequences来查看刚才创建成功的Sequence,如下图所示:

 1 --查看序列 2 SELECT * FROM sys.sequences WHERE name=Seq_test 

技术分享

3、使用序列

在单表中插入序列

技术分享

在多表间共享序列号

 1  --创建测试表1和测试表2
 2  CREATE table #test1
 3  (
 4    id bigint
 5  )
 6   CREATE table #test2
 7  (
 8    id bigint
 9  )
10  --插入测试数据
11  DECLARE @index bigint
12  SET @index=100000001
13  WHILE (@index<100000005)
14  begin
15     insert INTO #test1(id) VALUES (NEXT value FOR Seq_test)
16     insert INTO #test2(id) VALUES (NEXT value FOR Seq_test)
17     SET @index=@index+1
18  end
19  --展示测试数据
20  SELECT * FROM #test1
21  SELECT * FROM #test2

结果如下图所示:

技术分享

在可以看到,如果我们不指定Sequence的上限和下限,则默认使用所指定数据类型的最大值和最小值作为上限和下限(INT类型的的上下限).当达到上线后,可以指定循环来让Sequence达到上限后从指定的开始值重新开始循环。

 1 --创建序列
 2 CREATE sequence Seq_test1 --序列的名称:Seq_test
 3 as int --类型
 4 start with 1 --开始值
 5 increment by 1 --步长
 6 minvalue 1 --最小值
 7 maxvalue 5 --最大值
 8 cycle --循环
 9 --创建测试表
10 CREATE table test1
11 (
12   id int
13 )
14 DECLARE @index int
15 SET @index=0
16 WHILE(@index<10)
17 begin
18    insert INTO test1(id) VALUES (NEXT value FOR Seq_test1)
19    SET @index=@index+1
20 end
21 --查看结果
22 SELECT * FROM test1

查询结果如下图所示:

技术分享

可以通过修改Sequence将其初始值指定为一个特定值

1 --修改序列的值
2 ALTER sequence Seq_test1
3 restart WITH 3
4 --查询当前值
5 SELECT next value FOR Seq_test1

查询结果如下图所示:

技术分享

Sequence一个需要注意的情况是Sequence只负责生成序列号,而不管序列号如何使用,如果事务不成功或回滚,SequenceNumber仍然会继续向后生成序列号

技术分享

我们还可以为Sequence指定缓存选项,使得减少IO,比如,我们指定Cache选项为3,则当前的Sequence由1增长过3后,SQL Server会再分配3个空间变为从4到6,当分配到7时,SQL Server继续这以循环,如果不指定Cache值,则值由SQL Server进行分配。一个简单的例子如图所示。

技术分享

原文:http://www.cnblogs.com/dotnet261010/p/7082852.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!