一、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 
可以将序列定义为任何整数类型。允许以下类型。

    • tinyint - 范围0到255

    • smallint - 范围-32,768至32,767

    • int - 范围-2,147,483,648至2,147,483,647

    • bigint - 范围-9,223,372,036,854,775,808至9,223,372,036,854,775,807

    • 十进制和数字为0的规模。

    • 基于允许类型之一的任何用户定义的数据类型(别名类型)。

      如果没有提供数据类型,则使用bigint数据类型作为默认值。

      START WITH <constant> 
      序列对象返回的第一个值。START值必须小于一个值,或等于最大且大于或等于所述序列对象的最小值。新的序列对象的默认起始值​​是升序序列对象的最小值和降序序列对象的最大值。

      INCREMENT BY <constant> 
      用于每次调用NEXT VALUE FOR函数的序列对象的值递增(或减少为负)的值。如果增量是负值,则序列对象是递减的; 否则,它是升序。增量不能为0.新序列对象的默认增量为1。

      [MINVALUE <constant> | NO MINVALUE ] 
      指定序列对象的边界。新序列对象的默认最小值是序列对象的数据类型的最小值。对于tinyint数据类型为零,所有其他数据类型为负数。

      [MAXVALUE <constant> | NO MAXVALUE
      指定序列对象的边界。新序列对象的默认最大值是序列对象的数据类型的最大值。

      [CYCLE | NO CYCLE ] 
      指定序列对象是否应从最小值(或降序序列对象的最大值)重新启动的属性,或者在超过最小值或最大值时引发异常。新序列对象的默认循环选项为NO CYCLE。

      请注意,循环从最小值或最大值重新启动,而不是从起始值开始。

      [ CACHE [<constant>] | NO CACHE] 
      通过最小化生成序列号所需的磁盘IO数量,提高使用序列对象的应用程序的性能。默认为CACHE。

      例如,如果选择缓存大小为50,则SQL Server不会保留缓存50个单独的值。它只缓存当前值和缓存中剩下的值的数量。这意味着存储缓存所需的内存量始终是序列对象的数据类型的两个实例。

创建一个简单的序列

 CREATE sequence Seq_test --序列的名称:Seq_test
as bigint --类型
start with --开始值
increment by --步长
minvalue --最小值
maxvalue --最大值
no cycle --不循环
cache --设置缓冲

2、查询序列

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

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

3、使用序列

在单表中插入序列

在多表间共享序列号

  --创建测试表1和测试表2
CREATE table #test1
(
id bigint
)
CREATE table #test2
(
id bigint
)
--插入测试数据
DECLARE @index bigint
SET @index=
WHILE (@index<)
begin
insert INTO #test1(id) VALUES (NEXT value FOR Seq_test)
insert INTO #test2(id) VALUES (NEXT value FOR Seq_test)
SET @index=@index+
end
--展示测试数据
SELECT * FROM #test1
SELECT * FROM #test2

结果如下图所示:

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

 --创建序列
CREATE sequence Seq_test1 --序列的名称:Seq_test
as int --类型
start with --开始值
increment by --步长
minvalue --最小值
maxvalue --最大值
cycle --循环
--创建测试表
CREATE table test1
(
id int
)
DECLARE @index int
SET @index=
WHILE(@index<)
begin
insert INTO test1(id) VALUES (NEXT value FOR Seq_test1)
SET @index=@index+
end
--查看结果
SELECT * FROM test1

查询结果如下图所示:

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

 --修改序列的值
ALTER sequence Seq_test1
restart WITH
--查询当前值
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进行分配。一个简单的例子如图所示。

SQL SERVER 2012 SEQUENCE的更多相关文章

  1. SQL SERVER 2012使用sequence

    从之前Oracle转过来,现在看sql server中对于id的实现竟然用guid这种方式.为啥不像在Oracle中一样使用Sequence并行获取序列号呢?今天看MSDN才发现在sql server ...

  2. SQL Server 2012 数据库笔记

    慕课网 首页 实战 路径 猿问 手记     Python 手记 \ SQL Server 2012 数据库笔记 SQL Server 2012 数据库笔记 2016-10-25 16:29:33 1 ...

  3. SQL Server 2012 T-SQL 新特性

    序列 Sequence SQL Server 现在将序列当成一个对象来实现,创建一个序列的例子语法如下: CREATE SEQUENCE DemoSequence START WITH 1 INCRE ...

  4. SQL Server 2012 自动增长列,值跳跃问题

    介绍 从 SQL Server 2012 版本开始, 当SQL Server 实例重启之后,表格的自动增长列的值会发生跳跃,而具体的跳跃值的大小是根据增长列的数据类型而定的.如果数据类型是 整型(in ...

  5. Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集

    XML 介绍 <CustomersOrders> <Customer custid="1" companyname="Customer NRZBB&qu ...

  6. SQL Server 2012 自动增长列,值跳跃问题(自增增加1000)

    介绍 从 SQL Server 2012 版本开始, 当SQL Server 实例重启之后,表格的自动增长列的值会发生跳跃,而具体的跳跃值的大小是根据增长列的数据类型而定的.如果数据类型是 整型(in ...

  7. 【数据库】 SQL SERVER 2012 实用新特性

    [数据库] SQL SERVER 2012 实用新特性 官方链接 一. ALWAYS ON - 灾难恢复 二. 列存储索引 - 比非聚集索引效率高,但有索引表不允许修改数据(插入,更新,删除),用于读 ...

  8. SQL Server 2012 官方版 / SQL Server 2012下载

    SQL Server是微软的一款专业免费的关系数据库管理工具, 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理服务,SQL Server 数据库引擎为关系型数据和结构化 ...

  9. 《SQL Server 2012 T-SQL基础》读书笔记 - 8.数据修改

    Chapter 8 Data Modification SQL Server 2008开始,支持一个语句中插入多行: INSERT INTO dbo.Orders (orderid, orderdat ...

随机推荐

  1. python 爬虫之爬取大街网(思路)

    由于需要,本人需要对大街网招聘信息进行分析,故写了个爬虫进行爬取.这里我将记录一下,本人爬取大街网的思路. 附:爬取得数据仅供自己分析所用,并未用作其它用途. 附:本篇适合有一定 爬虫基础 crawl ...

  2. 【特效】几种实用的按钮hover效果

    效果预览:http://www.gbtags.com/gb/rtreplayerpreview-standalone/3095.htm html: <ul class="btn&quo ...

  3. 【转载】jQuery全屏滚动插件fullPage.js

    文章转载自dowebok http://www.dowebok.com/ 原文链接:http://www.dowebok.com/77.html 简介 如今我们经常能见到全屏网站,尤其是国外网站.这些 ...

  4. Scrapy框架--Requests对象

    Scrapy使用request对象来爬取web站点. request对象由spiders对象产生,经由Scheduler传送到Downloader,Downloader执行request并返回resp ...

  5. Hexo+Github搭建博客

    要使用Hexo,需要在你的系统中支持Nodejs以及Git,如果还没有,那就开始安装吧! 安装Node.js 下载Node.js 参考地址:安装Node.js 安装Git 下载地址:http://gi ...

  6. UEFI启动视频详解:启动分析+N项操作实例

    ============================================================= ※※※※最给力的视频解说※※※※ 2011hiboy全部共享资料:立刻去   ...

  7. python学习之第一课时--初始python

    Python前世今世 python是什么 python是一门多种用途的编程语言,时常在扮演脚本语言的角色 python流行原因 软件质量 提高开发者效率(python代码大小为C/java的1/3-1 ...

  8. js 中 new fn与new fn()的区别

    在有些代码中,看见了let fn = new Fn()和let fn = new Fn,刚开始有些人或许和我一样感到些许疑惑,但潜意识的也会想到,这两者说不定就是一样的.没错!!在没有参数的情况下这两 ...

  9. VS2017生成解决方案报错,提示对路径的访问被拒绝

    目前我用的vs2017的版本是15.3.5.生成解决方案有时会提示如下: 开始以为是权限的问题,找到相应的目录设置everyone权限,再次生成还是不行.重启VS试了下,还是不行. 最后无奈重启下电脑 ...

  10. mysql5.7在windows不能启动的方法及查看数据库大小命令

    1.将mysql目录下的my-default.ini改为my.ini 2.cmd进入mysql的bin目录下 3.执行mysqld --initialize进行初始化(如果mysql目录下已经存在da ...