关于Oracle数据库中创建序列时遇到的一些问题(START WITH 不能大于 MAXVALUE)

本文详细介绍了如何正确地创建序列,并提供了实例说明不同情况下序列参数的设置。解释了递增、递减序列的区别及其配置要点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

序列(sequence)就是所谓的序列号,每次取的时候它会自动增加。

关于创建序列的一点问题:

创建序列的基本语法为:

create sequence My_First_Sequence
start with 起始值(默认为1)
increment by 间隔数(每次加多少,如果省略,则默认为1)
maxvalue 最大值
minvalue 最小值
nocycle --一直累加,不会循环
nocache ;--不用缓存

首先是nocycle,nocache这两句,no与cycle或者cache之间是不能有空格的。

然后就是间隔数,间隔数>0,则为递增;间隔数<0,则为递减。

有些时候会看见这种写法:

create sequence my_seq2
start with 1
increment by 2
minvalue 1
nomaxvalue 
nocycle
nocache;

在语句中出现了nomaxvalue(no与maxvalue之间是不能有空格的),在这个例子中是可以用的。

但是nomaxvalue与nominvalue并不是什么情况下都可以使用的,只有以下两种情况可以使用:

(1)、当间隔数>0时,此时为递增序列,则可以不设置最大值,可以使用nomaxvalue ;

(2)、当间隔数<0时,此时为递减序列,则可以不设置最小值,可以使用nominvalue。

例如:创建序列,从9开始的整数,各个值应该比生成的前一个值小3.允许的最小的可能值为-1,

      并且不应该允许它进行循环,这个序列命名为MY_FIRST_SEQUENCE。

在刚开始写这个序列的时候,我是这样写的:

create sequence MY_FIRST_SEQUENCE
start with 9
increment by -3
minvalue -1
nomaxvalue
nocycle
nocache;

这样写是错误的。当时写的时候以为increment就是递增函数,和后面的间隔值得正负无关,但是这样写就是一直报错.

因为此时这已经是一个递减序列了,必须要有一个最大值。此时又想了这样写行不行:

create sequence MY_FIRST_SEQUENCE
start with 9
increment by -3
nominvalue 
maxvalue -1
nocycle
nocache;
结果是这样写也不行,但是当这样时是可以的 :
create sequence MY_FIRST_SEQUENCE
start with 9
increment by -3
nominvalue
maxvalue 9
nocycle
nocache;

即使maxvalue的值为7,8什么的都不行,会报错:START WITH 不能大于 MAXVALUE

所以此时maxvalue的值必须>=起始值。

所以正确的写法是:

create sequence MY_FIRST_SEQUENCE
start with 9
increment by -3
minvalue -1
maxvalue 9
nocycle
nocache;

和nomaxvalue一样,cycle和cache语句也是存在的:

cycle是当递增到最大值时,会自动跳到最小值继续递增,而nocycle则是递增到最大值时继续递增会报错;递减时同理。

cache定义存放序列的内存块的大小,默认为20。nocache表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。


顺便总结一下的其他用法:

获取序列的下一个值:

select 序列名.nextval from dual;

获取序列的当前值:

select 序列名.currval from dual;

修改序列(修改序列的增量, 最大值, 最小值, 循环选项, 或是否装入内存)

alter sequence 序列名

increment by ?------>修改间隔值

minvalue ?---------->修改最小值

maxvalue ?---------->修改最大值

nocycle------------->修改为是否循环

nocache------------->修改为是否缓存

;修改序列的一些注意事项:

(1)必须是序列的拥有者或对序列有 ALTER 权限

(2)只有将来的序列值会被改变

(3)改变序列的初始值只能通过删除序列之后重建序列的方法实现

删除序列:

drop sequence 序列名;

删除之后,序列不能再次被引用




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值