SQL Server 序列(SEQUENCE)使用
众所周知,在之前的SQL SERVER版本中,一般采用GUID或者IDENTITY来作为标示符,但是IDENTITY是一个表对象,只能保证在一张表里面的序列,当我们遇到以下情况时,
如上表,我们需要在多表之间,实现ID的一致性,在SQL SERVER里面就会有一定的麻烦,通常我们会使用额外使用一张TEMP表来映射这些ID的关系然后再从中取序列来完成。
SEQUENCE在ORACLE中其实很早就存在了,SQL SERVER 2012的SEQUENCE功能和那个相似,是一个基于SCHEMA的对象,所以可以被多表调用。
序列是用户定义的绑定到架构的对象,该对象可根据创建序列所依据的规范来生成数值序列。 这组数值以定义的间隔按升序或降序生成,并且可配置为用尽时重新启动(循环)。 序列不与特定表相关联,这一点与标识列不同。 应用程序将引用某一序列对象以便检索其下一个值。 序列与表之间的关系由应用程序控制。 用户应用程序可以引用一个序列对象,并跨多个行和表协调值。与在插入行时生成的标识列值不同,应用程序可以获得下一个序列号,而不必通过调用 NEXT VALUE FOR 函数来插入行。 使用 sp_sequence_get_range 同时获取多个序列号。
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 序列可定义为任何整数类型。如果未提供任何数据类型,则默认 bigint类型。
START WITH 序列对象返回的第一个值。 START 值必须小于或等于序列对象的最大值并大于或等于其最小值。
INCREMENT BY 每次调用 NEXT VALUE FOR 函数时序列对象值递增(如果为负数,则为递减)的值。
MIN和MAX 分别设置最小和最大值
CYCLE 设置是否循环,默认循环选项是 NO CYCLE
CACHE 通过最大限度地减少生成序列编号所需的磁盘 IO 数,可以提高使用序列对象的应用程序的性能。 默认值为 CACHE。
ORACLE中有SEQUENCE的功能,SQL SERVER类似的功能使用IDENTITY列实现,但是有很大的局限性。在2012中,微软终于增加了 SEQUENCE 对象,功能和性能都有了很大的提高。
我们可以在SSMS中创建也可以使用SQL SERVER脚本创建序列对象:


使用SQL创建序列对象:
IF EXISTS(SELECT * FROM sys.sequences WHERE name = N'TestSeq')
DROP SEQUENCE TestSeq;
GO
--创建序列对象
CREATE SEQUENCE TestSeq AS TINYINT
START WITH 1
INCREMENT BY 1;
GO
--创建表
CREATE TABLE TEST(ID tinyint, Name varchar(150))
--产生序列号码并插入表中
INSERT INTO TEST(ID,Name) VALUES(NEXT VALUE FOR TestSeq, 'allen')
INSERT INTO TEST(ID,Name) VALUES(NEXT VALUE FOR TestSeq, 'kevin') SELECT * FROM TEST

--产生序列可以重复使用,下面的例子当序列号码超过255后又重新从0开始。
CREATE SEQUENCE [dbo].[Test1Seq] AS [tinyint]
START WITH 0
INCREMENT BY 5
CYCLE SELECT NEXT VALUE FOR [Test1Seq]

--重新将序列初始值变为5
ALTER SEQUENCE dbo.TestSeq RESTART WITH 5; SELECT * FROM sys.sequences WHERE name = 'TestSeq'

--共享序列,两个表可以使用同一个序列对象(IDENTITY列是不可以的)
CREATE SEQUENCE dbo.Seq AS INT
START WITH 1
INCREMENT BY 1 CREATE TABLE dbo.Examp1
(
Seq INT NOT NULL,
Name VARCHAR(50) NOT NULL
); CREATE TABLE dbo.Examp2
(
Seq INT NOT NULL,
Name VARCHAR(50)NOTNULL
); INSERT INTO dbo.Examp1(Seq,Name) VALUES (NEXT VALUE FOR dbo.Seq, 'Tom');
INSERT INTO dbo.Examp2(Seq,Name) VALUES (NEXT VALUE FOR dbo.Seq, 'Jerry'); SELECT * FROM Examp1
SELECT * FROM Examp2

--可以直接在查询中使用序列对象(IDENTITY列是不可以的)
CREATE SEQUENCE SeqOrder AS tinyint
START WITH1
INCREMENT BY1
MINVALUE 1
NO MAXVALUE
CYCLE;
GO SELECT ID, Name,NEXT VALUE FOR SeqOrder OVER(ORDER BY Name DESC) AS [Order] FROM test;

为了提升性能,还可以使用CACHE选项,这样就可以将序列号码缓存到内存,减少IO操作,值得一提的是序列对象可以指定最大值和最小值,增加值可以为负数。
SQL Server 序列(SEQUENCE)使用的更多相关文章
- ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍
如果我是C罗 原文 ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍 sequence在ORACLE中应用十分广泛,就是序列号的意思,会自动增加指定变数,如逐次增加1或者2或者 ...
- SQL SERVER 2012 SEQUENCE
一.Sequence简介 Sequence对象对于Oracle用户来说是最熟悉不过的数据库对象了, 在SQL SERVER2012终于也可以看到这个对象了.Sequence是SQL Server201 ...
- Sql Server增加Sequence序列语句
1.创建序列 下面的示例创建名为 DecSeq 使用一个序列 十进制 具有介于 0 到 255 之间的数据类型.序列以 125 开始,每次生成数字时递增 25. 因为该序列配置为可循环,所以,当值超过 ...
- SQL server 和Oracle 序列
1,SQL Server序列创建与使用 BEGIN IF EXISTS (SELECT * FROM sysobjects WHERE name = 'event_seq') DROP SEQUENC ...
- sql server 2012 新知识-序列
今天聊一聊sql 2012 上的新功能-----序列 按我的理解,它就是为了实现全局性的唯一标识,按sql server 以前的版本,想对一张表标识很简单,比如identity,但如果要对某几张有业务 ...
- SQL Server的Linked Server支持使用SEQUENCE吗?
SQL Server的Linked Server支持使用SEQUENCE吗? SQL Server 2012开始支持序列(SEQUENCE),今天遇到有个同事咨询,能否在LINKED SERVER ...
- SQL SERVER 2012使用sequence
从之前Oracle转过来,现在看sql server中对于id的实现竟然用guid这种方式.为啥不像在Oracle中一样使用Sequence并行获取序列号呢?今天看MSDN才发现在sql server ...
- SQL Server数据库事务日志存储序列
原文 原文:http://blog.csdn.net/tjvictor/article/details/5251351 如果你的数据库运行在完整或是批量日志恢复模式下,那么你就需要使用作业(job ...
- sql server 基础语句
创建数据库 创建之前判断该数据库是否存在 if exists (select * from sysdatabases where name='databaseName') drop database ...
随机推荐
- Maven使用(一)—— Maven的安装与全局配置
一.Maven安装 Maven的安装步骤: 1.Maven官网(http://maven.apache.org/)下载压缩包,解压缩,当前最新版本是apache-maven-3.5.3-bin.zip ...
- eclipse中无法查看引用的jar包源码
本文来源:http://blog.csdn.NET/zljjava/article/details/7545270(这篇博客也是转载的,向最原始的作者致敬) 1.下载JAD jad官方地址的官方下载地 ...
- python之旅七【第七篇】面向对象之类成员
面向对象的类成员 相关知识点 一 字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段属于对象 静态字段属于类 class Provinc ...
- Codeforces Round #467 Div. 1
B:显然即相当于能否找一条有长度为奇数的路径使得终点出度为0.如果没有环直接dp即可.有环的话可以考虑死了的spfa,由于每个点我们至多只需要让其入队两次,复杂度变成了优秀的O(kE).事实上就是拆点 ...
- Codeforces1023E Down or Right 【贪心】
题目分析: 从起点开始询问终点连通性,优先右走.从终点开始询问起点连通性,优先上走. 代码: #include<bits/stdc++.h> using namespace std; in ...
- property装饰器
# 需要了解的property的用法 class People: def __init__(self,name): self.__name=name @property def name(self): ...
- python列表解析式,字典解析式,集合解析式和生成器
一.列表解析式(列表推倒式): 功能:是提供一种方便的列表创建方法,所以,列表解析式返回的是一个列表. 1 lst = [1, 3, 5, 8, 10] 2 ll = [x+x for x in ls ...
- 【XSY1081】随机存储器 网络流
题目描述 Bob有\(2^n\)字节的内存,编号为\([0,2^n-1)\).他想对每个字节的内存分别分配一个值.对于编号为\(i\)的内存,如果它被分配了一个值\(j(0\leq j<2^m) ...
- MySQL 练习题 附答案,未完
综合练习题 表结构 整合一下方便查看 teacher student course scors 练习题 1.自行创建测试数据 create table student( sid int prima ...
- pytorch搭建简单网络
pytorch搭建一个简单神经网络 import torch import torch.nn as nn # 定义数据 # x:输入数据 # y:标签 x = torch.Tensor([[0.2, ...