EsgynDB之递增序列

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,最大值为2的63次方 -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
;
发布了352 篇原创文章 · 获赞 400 · 访问量 73万+

猜你喜欢

转载自blog.csdn.net/Post_Yuan/article/details/103486888