序列-Sequence
是一种数据库对象,用于生成连续的、唯一的、数字序列
通常用于主键
用途与场景
- 主键生成,使用序列自动生成主键值
- 需要唯一标识的场景:如订单编号、票据号码、会员编号、商品编号等,都可以使用序列来生成唯一标识
DM序列用法
语法
CREATE SEQUENCE [IF NOT EXISTS] [<模式名>.]<序列名> [<序列选项列表>];
<序列选项列表> ::= <序列选项>{<序列选项>}
<序列选项> ::=
INCREMENT BY <增量值>|
START WITH <初值>|
MAXVALUE <最大值>|
NOMAXVALUE|
MINVALUE <最小值>|
NOMINVALUE|
CYCLE|
NOCYCLE|
CACHE <缓存值>|
NOCACHE|
ORDER |
NOORDER |
GLOBAL |
LOCAl
CYCLE
:指定序列为循环序列:当序列的值达到最大值/最小值时,序列将从最小值/最大值计数
CACHE
:表示序列的值是预先分配,并保持在内存中,以便更快地访问
<缓存值>
指定预先分配的值的个数,最小值为2;最大值为50000
ORDER
:保证在集群环境中也唯一且按顺序递增
在集群环境中,多个数据库实例可能同时访问和修改同一个序列
当设置为NOORDER时,序列值的生成不需要在集群环境中按顺序产生。这可能会导致不同节点上的序列值出现“跳跃”或“不连续”的情况,因为每个节点可能会根据自己的缓存和请求情况来生成序列值。然而,这并不会影响序列值的唯一性
ORDER选项不影响单实例数据库
序列的使用
在sql中用伪列获取序列的值
CURRVAL
:当前值
NEXTVAL
:如果为升序序列,序列值增加并返回增加后的值;如果为降序序列,序列值减少并返回减少后的值。如果第一次对序列使用该函数,则返回序列当前值
用户会话在第一次使用 CURRVAL 之前应先使用 NEXTVAL 获取序列当前值;之后除非会话使用 NEXTVAL 获取序列当前值,否则每次使用 CURRVAL 返回的值不变
示例
创建序列
--创建序列,执行如下SQL命令
CREATE SEQUENCE SEQ_FUT_XLGL_CJ INCREMENT BY 10 START WITH 1 CYCLE CACHE 10 ORDER;
调用序列生成序列值
--创建测试表,执行如下SQL命令:
Create table TAB_FUT_XLGL_CJ(C1 int,C2 varchar(10) );
--将序列的前两个值插入到表中,执行如下SQL命令
insert into TAB_FUT_XLGL_CJ values(SEQ_FUT_XLGL_CJ.nextval,'test');
insert into TAB_FUT_XLGL_CJ values(SEQ_FUT_XLGL_CJ.nextval,'test2');
--查询表数据,执行如下SQL命令
select * from TAB_FUT_XLGL_CJ;
返回结果集:
C1 C2
1 test
11 test2
查看序列当前值、下一个值
--获取序列的当前值,执行如下SQL命令
select SEQ_FUT_XLGL_CJ.CURRVAL;
-- 返回11
--获取序列的下一个值,执行如下SQL命令
select SEQ_FUT_XLGL_CJ.nextval;
-- 返回21
修改序列
--修改序列,执行如下SQL命令
ALTER SEQUENCE SEQ_FUT_XLGL_CJ INCREMENT BY 2 ;
修改序列当前值
--查询序列当前值
select SEQ_FUT_XLGL_CJ.nextval;
--修改序列当前值,比如当前值为1,这里设置当前值为10,执行如下SQL命令
alter SEQUENCE SEQ_FUT_XLGL_CJ CURRENT VALUE 10;
select SEQ_FUT_XLGL_CJ.nextval;
最后查看结果集为:
NEXTVAL
10
删除序列
--删除序列,执行如下SQL命令
drop SEQUENCE SEQ_FUT_XLGL_CJ;
参考:
https://eco.dameng.com/