sqlserver序列对象sequence

SEQUENCE

序列是用户定义的绑定到架构的对象,该对象可根据创建序列所依据的规范来生成数值序列。这组数值以定义的间隔按升序或降序生成,并且可配置为用尽时重新启动(循环)。 序列不与特定表相关联,这一点与标识列不同.

语法:

CREATE SEQUENCE [schema_name . ] sequence_name  --序列对象名
    [ AS [ built_in_integer_type | user-defined_integer_type ] ]  --整型(默认bigint)
    [ START WITH <constant> ]  --开始值(大于等于最小值,小于等于最大值)
    [ INCREMENT BY <constant> ]---增量  
    [ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]  --最小值
    [ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]  --最大值
    [ CYCLE | { NO CYCLE } ]  --是否循环
    [ { CACHE [ <constant> ] } | { NO CACHE } ] --缓存 
    [ ; ] 

示例:创建一个序列对象

CREATE SEQUENCE LTH.DecSeq
	AS decimal(3,0)--类型为decimal 3位有效数字,小数位为0
	START WITH 125--从125开始生成
	INCREMENT BY 25--每次增量为25
	MINVALUE 100--最小值:100
	MAXVALUE 200--最大值:200
	CYCLE--可循环
	CACHE 3--缓存3

生成序列函数:NEXT VALUE FOR LTH.DecSeq;没错,它就是一个函数,可以用来生成下一个序列号

SELECT NEXT VALUE FOR LTH.DecSeq;--return 125

查询当前序列号,表sys.sequences

SELECT current_value 
FROM sys.sequences 
where OBJECT_ID=OBJECT_ID('LTH.DecSeq','SO');--return 125

关于生成标识的NEXT VALUE FOR 函数说明

语法:

NEXT VALUE FOR [ database_name . ] [ schema_name . ]  sequence_name  
   [ OVER (<over_order_by_clause>) ] --这个OVER子句类似开窗函数

仔细看一下MSDN中的一段说明

1.在查询或默认约束中使用 NEXT VALUE FOR 函数时,如果多次使用相同的序列对象,或者在提供这些值的语句以及执行的默认约束中使用相同的序列对象,则为结果集的行中引用同一序列的所有列返回相同的值。

说明:注意这里的行中两个字,就是说,在同一段语句中同时执行同一个对象,行中的多个列会生产相同的值。

示例:调用了NEXT VALUE FOR LTH.DecSeq 两次,生成了相同的值125

SELECT NEXT VALUE FOR LTH.DecSeq AS col1,
NEXT VALUE FOR LTH.DecSeq AS col2
FROM LTH.t6;

--返回结果
col1                                    col2
--------------------------------------- ---------------------------------------
125                                     125

2.序列与排名函数一起使用

示例:根据lastname的排名生成序列号,注意展示数据无序,不受此order by 影响

SELECT NEXT VALUE FOR LTH.CountBy1 OVER(ORDER BY lastname) AS col1,
	firstname,lastname
FROM Person.Person

3.NEXT VALUE FOR 做默认约束

示例:

CREATE TABLE LTH.Mytable
(
	id	INT  PRIMARY KEY ,
	name	VARCHAR(20)	NOT NULL
);
--修改表添加约束
ALTER TABLE LTH.Mytable--修改表,添加约束
	ADD CONSTRAINT DFT_id
		DEFAULT(NEXT VALUE FOR LTH.CountBy1)--定义默认值为NEXT VALUE FOR 函数生成标识值
		FOR id;
--插入值
INSERT INTO LTH.Mytable(name) VALUES('LTH');--默认生成标识
INSERT INTO LTH.Mytable(id,name)VALUES(NEXT VALUE FOR LTH.CountBy1,'lth2');--调用函数生成


SELECT * FROM LTH.Mytable

返回结果:
id          name
----------- --------------------
19975       LTH
19976       lth2

4.NEXT VALUE FOR 在update 语句中的应用

示例:Mytable中原有两条记录,ID分别为19975,19976,用UPDATE语句调用NEXT VALUE FOR 函数修改后每行ID在原有最大值上逐渐递增19977,19976

UPDATE LTH.Mytable SET id=NEXT VALUE FOR LTH.CountBy1
WHERE ID>=19975

SELECT * FROM LTH.Mytable

--返回结果:
id          name
----------- --------------------
19977       LTH
19978       lth2

最后,MSDN中还有一段话我觉得它是对序列函数很好的一个总结:NEXT VALUE FOR 函数具有不确定性,只允许在明确定义了生成的序列值数目的上下文中使用。SELECT,UPDATE,INSERT VALUES,SELECT INTO,过程化的语句(比如,declare,set)

猜你喜欢

转载自blog.csdn.net/ilovetheworld/article/details/88845846