不同于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/NOMINVALUE | 最大值 |
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
>= START WITH
>= MAXVALUE
,超出区间就不能创建SEQUENCE
START WITH
比MINVALUE
小创建失败:
oracle> create SEQUENCE MY_FIRST_SEQUENCE
start with -2
increment by -1
minvalue 1
maxvalue 100
nocycle
nocache; 2 3 4 5 6 7
create SEQUENCE MY_FIRST_SEQUENCE
*
ERROR at line 1:
ORA-04006: START WITH ???? MINVALUE
START WITH
比MAXVALUE
大:
oracle> create SEQUENCE MY_SECOND_SEQUENCE
start with 101
increment by -1
minvalue 1
maxvalue 100
nocycle
nocache; 2 3 4 5 6 7
create SEQUENCE MY_SECOND_SEQUENCE
*
ERROR at line 1:
ORA-04008: START WITH ???? MAXVALUE
特殊情况
在使用SEQUENCE的时候发现有两种特殊情况:
一 、当INCREMENT BY < 0 处于递减数列时
递减数列,START WITH
比 MINVALUE
小1 的时候,SEQUENCE 还能正常创建:
oracle> create SEQUENCE MY_FIRST_SEQUENCE
start with -2
increment by -1
minvalue -1
maxvalue 100
nocycle
nocache;
2 3 4 5 6 7
Sequence created.
但是SEQUENCE 是 NOCYCLE
,创建后不能使用:
oracle> select MY_FIRST_SEQUENCE.nextval from dual;
select MY_FIRST_SEQUENCE.nextval from dual
*
ERROR at line 1:
ORA-08004: ?? MY_FIRST_SEQUENCE.NEXTVAL goes below MINVALUE ?????
START WITH
比MINVALUE
小太多就不能创建了:
oracle> create SEQUENCE MY_FIRST_SEQUENCE
start with -3
increment by -1
minvalue -1
maxvalue 100
nocycle
nocache; 2 3 4 5 6 7
create sequence MY_FIRST_SEQUENCE
*
ERROR at line 1:
ORA-04006: START WITH ???? MINVALUE
oracle> drop SEQUENCE MY_FIRST_SEQUENCE;
Sequence dropped.
oracle> create SEQUENCE MY_FIRST_SEQUENCE
start with 101
increment by -1
minvalue 1
maxvalue 100
nocycle
nocache; 2 3 4 5 6 7
create sequence MY_FIRST_SEQUENCE
*
ERROR at line 1:
ORA-04008: START WITH ???? MAXVALUE
oracle> create sequence MY_FIRST_SEQUENCE
start with -1
increment by -1
minvalue 1
maxvalue 100
nocycle
nocache; 2 3 4 5 6 7
create sequence MY_FIRST_SEQUENCE
*
ERROR at line 1:
ORA-04006: START WITH ???? MINVALUE
二、当INCREMENT BY > 0 处于递增数列时
递增数列时情况相反
START WITH
比MAXVALUE
大1就能创建
oracle> create sequence MY_FIRST_SEQUENCE
start with 101
increment by 1
minvalue 1
maxvalue 100
nocycle
nocache; 2 3 4 5 6 7
Sequence created.
但是 SEQUENCE 为 NOCYCLE
,创建后不能使用:
oracle> select MY_FIRST_SEQUENCE.nextval from dual;
select MY_FIRST_SEQUENCE.nextval from dual
*
ERROR at line 1:
ORA-08004: ?? MY_FIRST_SEQUENCE.NEXTVAL exceeds MAXVALUE ?????
sequence
Specify the name of the sequence to be created. The name must satisfy the requirements listed in “Database Object Naming Rules”.
If you specify none of the clauses INCREMENT BY through GLOBAL, then you create an ascending sequence that starts with 1 and increases by 1 with no upper limit. Specifying only INCREMENT BY -1 creates a descending sequence that starts with ‐1 and decreases with no lower limit.
To create a sequence that increments without bound, for ascending sequences, omit the MAXVALUE parameter or specify NOMAXVALUE. For descending sequences, omit the MINVALUE parameter or specify the NOMINVALUE.
To create a sequence that stops at a predefined limit, for an ascending sequence, specify a value for the MAXVALUE parameter. For a descending sequence, specify a value for the MINVALUE parameter. Also specify NOCYCLE. Any attempt to generate a sequence number once the sequence has reached its limit results in an error.
To create a sequence that restarts after reaching a predefined limit, specify values for both the MAXVALUE and MINVALUE parameters. Also specify CYCLE.
GreatSQL 特性
GreatSQL 的使用就比较严格了: MINVALUE
>= START WITH
>= MAXVALUE
没发现像Oracle那样的特殊情况
greatsql> create sequence MY_FIRST_SEQUENCE
-> start with -1
-> increment by 1
-> minvalue 1
-> maxvalue 100
-> nocycle
-> nocache;
ERROR 8582 (HY000): create sequence failed, cause START WITH should between MINVALUE and MAXVALUE!
greatsql> create sequence MY_FIRST_SEQUENCE
-> start with 101
-> increment by 1
-> minvalue 1
-> maxvalue 100
-> nocycle
-> nocache;
ERROR 8582 (HY000): create sequence failed, cause START WITH should between MINVALUE and MAXVALUE!
greatsql> create sequence MY_FIRST_SEQUENCE
-> start with 102
-> increment by 1
-> minvalue 1
-> maxvalue 100
-> nocycle
-> nocache;
ERROR 8582 (HY000): create sequence failed, cause START WITH should between MINVALUE and MAXVALUE!
greatsql> create sequence MY_FIRST_SEQUENCE
-> start with 101
-> increment by -1
-> minvalue 1
-> maxvalue 100
-> nocycle
-> nocache;
ERROR 8582 (HY000): create sequence failed, cause START WITH should between MINVALUE and MAXVALUE!
greatsql> create sequence MY_FIRST_SEQUENCE
-> start with -1
-> increment by -1
-> minvalue 1
-> maxvalue 100
-> nocycle
-> nocache;
ERROR 8582 (HY000): create sequence failed, cause START WITH should between MINVALUE and MAXVALUE!
greatsql> create sequence MY_FIRST_SEQUENCE
-> start with 0
-> increment by -1
-> minvalue 1
-> maxvalue 100
-> nocycle
-> nocache;
ERROR 8582 (HY000): create sequence failed, cause START WITH should between MINVALUE and MAXVALUE!
greatsql> drop sequence MY_FIRST_SEQUENCE;
ERROR 1046 (3D000): No database selected
greatsql> create sequence MY_FIRST_SEQUENCE
-> start with -10
-> increment by -1
-> minvalue -9
-> maxvalue 100
-> nocycle
-> nocache;
ERROR 8582 (HY000): create sequence failed, cause START WITH should between MINVALUE and MAXVALUE!
总结
GreatSQL 和 Oracle 对 START WITH
的边界定义基本一致,都是 MINVALUE
>= START WITH
>= MAXVALUE
,但是 Oracle 会有两个特殊情况。
相关文档
-
SEQUENCE Oracle文档:
-
GreatSQL SEQUENCE文档:
-
ORA-04013,CACHE 值必须小于CYCLE值;解决方案
Enjoy GreatSQL
关于 GreatSQL
GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。
相关链接: GreatSQL社区 Gitee GitHub Bilibili
GreatSQL社区:
社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html
技术交流群:
微信:扫码添加
GreatSQL社区助手
微信好友,发送验证信息加群
。
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容