EsgynDB之递增序列

2022-06-30 00:00:00 序列 会话 值为 保证 递增

EsgynDB在很早期的版本就已经开始支持了SEQUENCE(序列)这一对象了。SEQUENCE的用法符合标准用法,与其他关系型数据库如Oracle使用方法几乎没有区别。以下是摘自SQL手册里面的关于创建SEQUENCE的语法,

CREATE SEQUENCE [[catalog-name.]schema-name.]sequence-name
[START WITH integer]
[INCREMENT BY integer]
[MAXVALUE integer | NO MAXVALUE]
[MINVALUE integer]
[CACHE integer | NO CACHE]
[CYCLE | NO CYCLE]
[DATA TYPE]
默认情况下,它是一个递增序列,以1开头,增量为1,缓存值为 25,大值为263次方 -2,不循环,属于LARGEINT数据类型。

我们可以使用SEQNUM(sequence-name, CURRENT)来获取当前会话序列返回的当前值,也可以使用 SEQNUM(sequence-name, NEXT)来获取当前会话序列返回的下一个值。
关于以上获取序列当前值和下一个值的用法,在新的EsgynDB版本中,我们同样也兼容了Oracle的语法,如下,

sequence-name.currval ==> select seqnum(sequence-name, CURRENT)
sequence-name.nextval ==> select seqnum(sequence-name, NEXT)

由于EsgynDB是分布式的架构,不同的会话正常情况下是连接到不同的节点上的,因此在早期的版本里面,EsgynDB提供的SEQUENCE并不能保证序列的递增特性,尤其是在有CACHE的情况下。打个比如,A会话连接到节点1,当前的SEQUENCE取到的值为51,CACHE值为25,则A会话当前阶段取值范围为51075。B会话连接到节点2,当前的SEQUENCE取到的值为31,CACHE值同样是25,则B会话当前阶段取值范围为31-55。如果A会话后于B会话获取序列值,那么就会出现先取到大的序列值后取到小的序列值且序列值也将不连续。
但序列的值是可以保证的。因此早期版本中EsgynDB中的序列是可以保证性,但无法保证单调递增特性。

为解决此问题,EsgynDB在新的版本里面对SEQUENCE做了增强,提供了以下两种增强,

1. ORDER SEQUENCE

语法

CREATE SEQUENCE [[catalog-name.]schema-name.]sequence-name
[START WITH integer]
[INCREMENT BY integer]
[MAXVALUE integer | NO MAXVALUE]
[MINVALUE integer]
[CACHE integer | NO CACHE]
[CYCLE | NO CYCLE]
[ORDER | NOORDER]
[DATA TYPE]

样例

>>create sequence seq0 order;       

--- SQL operation complete.
>>showddl sequence seq0;

CREATE SEQUENCE TRAFODION.SEABASE.SEQ0
START WITH 1
INCREMENT BY 1
MAXVALUE 9223372036854775806
MINVALUE 1
CACHE 25
ORDER
NO CYCLE
LARGEINT
;

使用

>>select seq0.nextval from dual;

NEXTVAL
--------------------

2

--- 1 row(s) selected.
>>fc
>>select seq0.nextval from dual;
..

NEXTVAL
--------------------

3

--- 1 row(s) selected.
>>fc
>>select seq0.nextval from dual;
..

NEXTVAL
--------------------

4

--- 1 row(s) selected.

2. GLOBAL SEQUENCE

语法

CREATE SEQUENCE sequence-name GLOBAL  [ TIMEOUT <optional timeout_val in microseconds> ]
Example 1: create sequence sg0 global;
Example 2: create sequence sg1 global timeout 10000; -- global sequence id with timeout = 10000 microseconds.

样例

>>create sequence seq2 global;

--- SQL operation complete.
>>showddl sequence seq2;

CREATE SEQUENCE TRAFODION.SEABASE.SEQ2 /* SYSTEM */
GLOBAL TIMEOUT -1
MAXVALUE 9223372036854775806
LARGEINT
;

使用

>>select seq2.nextval from dual;

NEXTVAL
--------------------

1652587917737113

--- 1 row(s) selected.
>>fc
>>select seq2.nextval from dual;
..

NEXTVAL
--------------------

1652587920882866

--- 1 row(s) selected.
>>fc
>>select seq2.nextval from dual;
..

NEXTVAL
--------------------

1652587924028621

--- 1 row(s) selected.

关于自增列

关于自增列,我们在之前的文章Trafodion sequence与自增序列中已经有所介绍。
默认情况下,自增列创建出来的SEQEUNCE是NOORDER属性的,如果我们想保证自增列也是递增的,只需要按照以下方式在创建自增列的时候加上(order)即可。

>>create table test2(a largeint generated always as identity (order));   

--- SQL operation complete.
>>showddl test2;

CREATE TABLE TRAFODION.SEABASE.TEST2
(
A LARGEINT GENERATED ALWAYS AS IDENTITY (
START WITH 1 INCREMENT BY 1 MAXVALUE 9223372036854775806 MINVALUE 1
CACHE 25 ORDER NO CYCLE LARGEINT ) NOT NULL NOT DROPPABLE NOT
SERIALIZED
)
ATTRIBUTES ALIGNED FORMAT NAMESPACE 'TRAF_RSRVD_3'
;

-- The following sequence is a system created sequence --

--CREATE SEQUENCE TRAFODION.SEABASE."_TRAFODION_SEABASE_TEST2_A_" /* INTERNAL, SEQ_UID = 1214493710344229254 */
START WITH 1
INCREMENT BY 1
MAXVALUE 9223372036854775806
MINVALUE 1
CACHE 25
ORDER
NO CYCLE
LARGEINT
;



————————————————
版权声明:本文为CSDN博主「post_yuan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Post_Yuan/article/details/103486888

相关文章