不同于Oracle:SEQUENCE的区别
前言
在使用Oracle数据库SEQUENCE功能时,发现Oracle对边界处理比较奇怪。刚好GreatSQL也支持SEQUENCE,就拿来一起比较一下。
先说结论:GreatSQL 的使用基本和Oracle基本一致,但是对 START WITH 的边界限制有所不同。
本次测试使用数据库的版本号
# Oracle版本
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
# GreatSQL版本
greatsql> \S
...
Server version: 8.0.32-25 GreatSQL, Release 25, Revision 79f57097e3f
...
1 row in set (0.00 sec)
SEQUENCE 使用介绍
SEQUENCE 有以下几个常用的参数
参数名 | 介绍 |
---|---|
START WITH | 起始值 |
INCREMENT BY | 步长 |
MINVALUE/NOMINVALUE | 最小值 |
MAXVALUE/NOMAXVALUE | 最大值 |
CYCLE/NOCYCLE | 是否回收 |
CACHE/NOCACHE | (cache性能好但有丢数据的风险) |
INCREMENT BY 怎么用
INCREMENT BY 的值大于0时,为递增序列
INCREMENT BY 的值小于0时,为递减序列
何时能使用NOMINVALUE &NOMINVALUE
- INCREMENT BY的值大于0时(递增序列),可以用NOMAXVALUE;
- INCREMENT BY的值小于0时(递减序列),可以用NOMINVALUE。
To create a sequence that increments without bound, for ascending sequences, omit the
MAXVALUE
parameter or specifyNOMAXVALUE
. For descending sequences, omit theMINVALUE
parameter or specify theNOMINVALUE
.
CYCLE/NOCYCLE
如果是CYCLE
,当序列的值超出设定的范围时,会从最大值/最小值开始重新进行循环。
递增数列从最小值开始循环,递减数列从最大值开始循环。
oracle> CREATE SEQUENCE seq1
START WITH 101
minvalue 100
INCREMENT BY -10
MAXVALUE 130
nocache
CYCLE;
#多次执行
oracle> select seq1.nextval from dual;
#返回值依次为:
101->130->120->110>100
Oracle SEQUENCE 特性
START WITH 边界
默认情况下是认为 MINVALUE
<=