SQL Server中Sequence对象用法

一、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个单独的值。它只缓存当前值和缓存中剩下的值的数量。这意味着存储缓存所需的内存量始终是序列对象的数据类型的两个实例。

1、创建一个简单的序列

CREATE sequence Seq_test --序列的名称:Seq_test
as bigint --类型
start with 100000001 --开始值
increment by 1 --步长
minvalue 1 --最小值
maxvalue 999999999 --最大值
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=100000001
 WHILE (@index<100000005)
 begin
    insert INTO #test1(id) VALUES (NEXT value FOR Seq_test)
    insert INTO #test2(id) VALUES (NEXT value FOR Seq_test)
    SET @index=@index+1
 end
 --展示测试数据
 SELECT * FROM #test1
 SELECT * FROM #test2

结果如下图所示:

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

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

查询结果如下图所示:

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

--修改序列的值
ALTER sequence Seq_test1
restart WITH 3
--查询当前值
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中Sequence对象用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SQL Server的存储过程详解

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

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

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

  • SQL Server 索引和视图详解

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

  • 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 数据库的设计详解

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

  • SQL Server的触发器你了解多少

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

  • SQL Server新特性SequenceNumber用法介绍

    简介 SequenceNumber是SQL Server2012推出的一个新特性.这个特性允许数据库级别的序列号在多表或多列之间共享.对于某些场景会非常有用,比如,你需要在多个表之间公用一个流水号.以往的做法是额外建立一个表,然后存储流水号.而新插入的流水号需要两个步骤: 1.查询表中流水号的最大值 2.插入新值(最大值+1) 现在,利用SQL Server2012中的Sequence.这类操作将会变得非常容易. SequenceNumber的基本概念 SequenceNumber的概念并不是一

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

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

  • SQL Server中Sequence对象用法

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

  • SQL Server 中 RAISERROR 的用法详细介绍

    SQL Server 中 RAISERROR 的用法 raiserror 的作用: raiserror 是用于抛出一个错误.[ 以下资料来源于sql server 2005的帮助 ] 其语法如下: RAISERROR ( { msg_id | msg_str | @local_variable } { ,severity ,state } [ ,argument [ ,...n ] ] ) [ WITH option [ ,...n ] ] 简要说明一下: 第一个参数:{ msg_id | ms

  • SQL Server中row_number函数用法入门介绍

    目录 一.SQL Server Row_number函数简介 二.Row_number函数的具体用法 1.使用row_number()函数对结果集进行编号 2.对结果集按照指定列进行分组,并在组内按照指定列排序 3.对结果集按照指定列去重 总结 一.SQL Server Row_number函数简介 ROW_NUMBER()是一个Window函数,它为结果集的分区中的每一行分配一个连续的整数. 行号以每个分区中第一行的行号开头. 语法实例: select *,row_number() over(

  • SQL Server中锁的用法

    目录 通过锁可以防止的问题 1.脏读 2.非重复性读取 3.幻读 4.丢失更新 可以锁定的资源 锁升级和锁对性能的影响 锁定模式 1.共享锁 2.排它锁 3.更新锁 4.意向锁 5.模式锁 6.批量更新锁 锁的兼容性 使用Management Studio确定锁 设置隔离级别 1.READ COMMITTED 2.READ UNCOMMITTED 3.REPEATABLE READ 4.SERIALIZABLE 5.SNAPSHOT 处理死锁 1.判断死锁的方式 2.选择死锁牺牲者的方式 3.避

  • SQL Server中分区表的用法

    目录 一.分区表简介 二.对表分区的理由 三.分区表的操作步骤 第一步.定义分区函数: 第二步.定义分区构架 第三步.定义分区表 四.分区表的分割 五.分区表的合并 一.分区表简介 分区表是SQL Server2005新引入的概念,这个特性在逻辑上将一个表在物理上分为多个部分.(即它允许将一个表存储在不同的物理磁盘里).在SQL Server2005之前,分区表实际上是分布式视图,也就是多个表做union操作. 分区表在逻辑上是一个表,而物理上是多个表.在用户的角度,分区表和普通表是一样的,用户

  • SQL Server中索引的用法详解

    目录 一.索引的介绍 什么是索引? 1.聚集索引和非聚集索引 2.索引的利弊 3.索引的存储机制 二.设置索引的权衡 1.什么情况下设置索引 2.什么情况下不要设置索引 三.聚集索引 1.使用SSMS创建聚集索引 2.使用T-SQL创建聚集索引 四.非聚集索引 1.SSMS创建方法同上,T-SQL创建方法如下: 2.添加索引选项 五.示例 六.管理索引 一.索引的介绍 什么是索引? 索引是一种磁盘上的数据结构,建立在表或视图的基础上.使用索引可以使数据的获取更快更高校,也会影响其他的一些性能,如

  • SQL Server中查看对象定义的SQL语句

    除了在SSMS中查看view,存储过程等定义,也可以使用下面的语句直接查询: 复制代码 代码如下: SELECT object_definition(object_id('sys.tables')); go sp_helptext 'sys.tables' go select * from sys.system_sql_modules whereobject_id = object_id('sys.tables') 适用于以下对象类型: ·        C = 检查约束 ·        D

  • SQL Server中row_number分页查询的用法详解

    ROW_NUMBER()函数将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的编号.在查询时应用了一个排序标准后,只有通过编号才能够保证其顺序是一致的,当使用ROW_NUMBER函数时,也需要专门一列用于预先排序以便于进行编号. ROW_NUMBER() 说明:返回结果集分区内行的序列号,每个分区的第一行从1开始. 语法:ROW_NUMBER () OVER ([ <partition_by_clause> ] <order_by_clause>) . 备注:ORDER

  • SQL Server序列SEQUENCE用法介绍

    目录 一.概述 选择使用序列的情况: 二.创建序列:CREATE SEQUENCE 二.使用序列号:NEXT VALUE FOR 1.序列值插入到表中 2.在select 语句中使用 NEXT VALUE FOR . 3.通过使用 OVER 子句为结果集生成序列号 4.sp_sequence_get_range:同时获取多个序列号 5.将表从标识更改为序列 三.管理序列 1.更新(重置)序列:ALTER SEQUENCE 2.DROP SEQUENCE:删除序列 3.查看序列信息 一.概述 SQ

随机推荐