我在这里记录一下学习序列的重要知识点。
一、递增序列的创建
(1)创建序列
drop sequence text_1; --为了下一次的操作方便,都会在前面加这个,当然也可以删除
create sequence text_1 --关键词是sequence
start with 1 --从1开始
INCREMENT by 1 --步长是1
nocycle --不循环,递增,(循环用cycle)
cache 5; --一次在序列中生成5个数 oracle默认序列是从1开始的
(2)
-
dual:是oracle中虚拟表,进行一些操作不清楚的时候可以在里面试验。(如果还是不懂,白话解释就是:“之前select * from student 这些都是访问固定的表student。但是如果你想要试验某个操作,但是你没有表操作的时候,就可以用dual虚拟表”)
-
currval、nextval
oracle的两个参数是currval、nextval。分别是当前值,和下一个值。但是在执行currval时,应先执行一遍nextval。要先有下一个值,才会出现当前值。因为是题目中是从1开始的,如果先nextval,然后会出现值1。然后再currval出现的值才是1。如果一开始就currval,第一个值还没有值。
总之就是,先nextval再currval。
(3)查询
- 先执行currval时,报错
select text_1.currval from dual;
- 应该先执行nextval
select text_1.nextval from dual;
再执行一遍就是
依次往下执行,就会一直递增(因为上面我写的是nocycle)
二、循环序列之从1开始循环
(1)创建序列(循环时要设置最大值)
drop sequence text_2; --为了下一次的操作方便,都会在前面加这个,当然也可以删除
create sequence text_2 --关键词是sequence
start with 1 --从1开始
maxvalue 3 --循环到最大值3
INCREMENT by 1 --步长是1
cycle --循环
cache 2; --一次在序列中生成2个数 oracle默认序列是从1开始的
(2)查询
select text_2.nextval from dual;
从1一直循环到3(我直接跳到了3这个位置)
再执行的时候应该跳到了1
三、循环队列之从100开始循环(重点!)
(1)创建序列(有雷!)先看下面这个,感受一下
循环时要注意(maxvalue-start的值)>=cache的值
--序列
drop sequence text_2;
create sequence text_2
start with 100 --从1开始
maxvalue 103
INCREMENT by 1 --步长是1
cycle --不循环,递增,(循环用cycle)
cache 2; --一次在序列中生成2个数 oracle默认序列是从1开始的
正常小伙伴看了觉得是:从100开始,步长为1,开始循环到103,然后再循环依次下去。
可是!!!!!当执行到103之后,不是100啦,从1开始了。
上图感受下!
下一次:
-
此时,一定会有人问,为什么?
因为序列默认是从1开始的
-
那怎么办?
只需要加上最小值即可。
修改:
drop sequence text_2;
create sequence text_2
start with 100 --从1开始
minvalue 100
maxvalue 103
INCREMENT by 1 --步长是1
cycle --不循环,递增,(循环用cycle)
cache 2; --一次在序列中生成2个数 oracle默认序列是从1开始的
然后查询:
select text_2.nextval from dual;
循环下面:
最后完成啦!
四、总结
两个参数currval、nextval。其中先执行nextval才可以执行currval。
递增的是nocycle。
循环时cycle,循环时要确认最大值,(最小值看需要)