SQL Server新特性SequenceNumber用法介绍

简介

SequenceNumber是SQL Server2012推出的一个新特性。这个特性允许数据库级别的序列号在多表或多列之间共享。对于某些场景会非常有用,比如,你需要在多个表之间公用一个流水号。以往的做法是额外建立一个表,然后存储流水号。而新插入的流水号需要两个步骤:

  • 1.查询表中流水号的最大值
  • 2.插入新值(最大值+1)

现在,利用SQL Server2012中的Sequence.这类操作将会变得非常容易。

SequenceNumber的基本概念

SequenceNumber的概念并不是一个新概念,Oracle早就已经实现了(http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_6015.htm)。与以往的Identity列不同的是。SequenceNumber是一个与构架绑定的数据库级别的对象,而不是与具体的表的具体列所绑定。这意味着SequenceNumber带来多表之间共享序列号的遍历之外,还会带来如下不利影响:

  • 与Identity列不同的是,Sequence插入表中的序列号可以被Update,除非通过触发器来进行保护
  • 与Identity列不同,Sequence有可能插入重复值(对于循环SequenceNumber来说)
  • Sequence仅仅负责产生序列号,并不负责控制如何使用序列号,因此当生成一个序列号被Rollback之后,Sequence会继续生成下一个号,从而在序列号之间产生间隙。

SequenceNumber的用法

SequenceNumber在MSDN中定义的原型如代码1所示。

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 } ]
    [ ; ]

代码1.Sequence的创建原型

由代码1看以看到,参数相对比较简单。从指定数据类型(INT兼容)到开始计数点,步长,最大值和最小值,是否循环和是否缓存几个参数来设置Sequence。

下面图1创建了一个简单的Sequence。

图1.创建一个简单的Sequence并进行使用

此时,我们可以通过SQL Server 2012新增的视图sys.sequences来看到刚才创建成功的Sequence,如图2所示.

图2.sys.sequences视图

当然我们可以这个序列按照顺序插入表,如图3所示。

图3.在单表中插入序列

而SequenceNumber最重要的功能是在多表间共享序列号,如图4所示。

图4.多表之间利用Sequence共享序列号

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

图5.Sequence设置上限下限和循环

还可以通过修改Sequence将其初始值指定为一个特定值,如图6所示。

图6.重置Sequence的值

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

图7.Sequence仅仅负责生成序列号

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

图8.为Sequence设置Cache选项

总结

本文讲述了SequenceNumber的简单用法。Sequence是一个比较方便的功能,如果使用妥当,将会大大减少开发工作和提升性能。

参考资料:

Sequence Numbers

CREATE SEQUENCE (Transact-SQL)

到此这篇关于SQL Server新特性SequenceNumber用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SQL Server 的T-SQL高级查询详解

    目录 基本常用查询 嵌套子查询 from (select … table)示例 示例 in, not in子句查询示例 exists和not exists子句查询示例 some.any.all子句查询示例 聚合查询 1. distinct去掉重复数据 2. compute和compute by汇总查询 3. cube汇总 排序函数 基本语法 row_number函数 rank函数函数 dense_rank函数 partition by分组子句 ntile平均排序函数 集合运算 1. union和

  • SQL Server 数据库的设计详解

    一.数据库设计的必要性 在实际的软件项目中,如果系统中需要存储的数据量比较大,需要设计的表比较多,表与表之间的关系比较复杂,那我们就需要进行规范的数据库设置.如果不经过数据库的设计,我们构建的数据库不合理.不恰当,那么数据库的维护.运行效率会有很大的问题.这将直接影响到项目的运行性和可靠性. 二.什么是数据库设计 数据库设计实际上就是规划和结构化数据库中的数据对象以及这些数据对象之间的关系过程. 三.数据库设计的重要性 不经过设计的数据库或是设计糟糕的数据库很可能导致 1. 数据库运行效率地下

  • SQL Server 使用 Pivot 和 UnPivot 实现行列转换的问题小结

    对于行列转换的数据,通常也就是在做报表的时候用的比较多,之前也零零散散的看了一些,今天就来总结一下. 先创建一个用于演示的临时表: create table #temp ( 年份 nvarchar(10) null, 月份 nvarchar(10) null, 数量 int null ) insert into #temp(年份,月份,数量) select '2015','1','5645' union select '2015','2','1234' union select '2015','

  • SQL Server中Sequence对象用法

    一.Sequence简介 Sequence对象对于Oracle用户来说是最熟悉不过的数据库对象了, 在SQL SERVER2012终于也可以看到这个对象了.Sequence是SQL Server2012推出的一个新特性.这个特性允许数据库级别的序列号在多表或多列之间共享. 二.Sequence基本概念 Oracle中有Sequence的功能,SQL server类似的功能要使用identity列实现,但是identity列有很大的局限性.微软终于在2012中添加了Sequence对象.与以往id

  • SQL Server 索引和视图详解

    目录 索引 1. 什么是索引 2. 索引分类 聚集索引 非聚集索引 其他类型索引 3. 创建索引 4. 适合的创建索引的列 5. 不适合创建索引的列 视图 1. 什么是视图 2. 创建视图准则 3. 创建视图 4. 修改视图 5. 加密视图 总结 索引 1. 什么是索引 索引就是数据表中数据和相应的存储位置的列表,利用索引可以提高在表或视图中的查找数据的速度. 2. 索引分类 数据库中索引主要分为两类:聚集索引和非聚集索引.SQL Server 2005还提供了唯一索引.索引视图.全文索引.xm

  • SQL Server的存储过程详解

    目录 存储过程的概念 存储过程的优点 系统存储过程 用户自定义存储过程 1. 创建语法 2. 创建不带参数存储过程 3. 修改存储过程 4. 带参存储过程 5. 带通配符参数存储过程 6. 带输出参数存储过程 7. 不缓存存储过程 8. 加密存储过程 9. 带游标参数存储过程 10. 分页存储过程 Raiserror 总结 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可

  • SQL Server的触发器详解

    目录 什么是触发器 DML触发器分为: 创建触发器 创建insert类型触发器 创建delete类型触发器 创建update类型触发器 update更新列级触发器 instead of类型触发器 创建instead of触发器 显示自定义消息raiserror 修改触发器 启用.禁用触发器 查询创建的触发器信息 示例,验证插入数据 示例,操作日志 总结 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称

  • SQL Server Transact-SQL编程详解

    目录 变量 1. 局部变量(Local Variable) 2. 全局变量(Global Variable) 输出语句 逻辑控制语句 1. if-else判断语句 2. while…continue…break循环语句 3. case 4. 其他语句 总结 T-SQL语句用于管理SQL Server数据库引擎实例,创建和管理数据库对象,以及查询.插入.修改和删除数据. 变量 1. 局部变量(Local Variable) 局部变量是用户可以自定义的变量,它的作用范围是仅在程序内部,在程序中通常用

  • SQL Server 数据库基础编程详解

    目录 Go批处理语句 使用.切换数据库 创建.删除数据库 方法1. 方法2(设置文件大小). 基本数据类型 判断表或其他对象及列是否存在 创建.删除表 给表添加字段.修改字段.删除字段 添加.删除约束 插入数据 查询.修改.删除数据 备份数据.表 利用存储过程查询表信息 总结 Go批处理语句 用于同时执行多个语句 使用.切换数据库 use master go 创建.删除数据库 方法1. --判断是否存在该数据库,存在就删除 if (exists (select * from sys.databa

  • SQL server中提示对象名无效的解决方法

    产生SQL对象名无效的问题大多原因是由于数据迁移导致的,下面我们给出解决方法. 在使用数据库的过程中,经常会遇到数据库迁移或者数据迁移的问题,或者有突然的数据库损坏,这时需要从数据库的备份中直接恢复.但是,此时会出现问题,这里说明几种常见问题的解决方法. 一.孤立用户的问题 比如,以前的数据库的很多表是用户test建立的,但是当我们恢复数据库后,test用户此时就成了孤立用户,没有与之对应的登陆用户名,哪怕你建立了一个test登录用户名,而且是以前的用户密码,用该用户登录后同样没办法操作以前属于

随机推荐