五、Oracle 序列


一、序列介绍

  • 序列是 Oracle 提供的用于产生一系列 唯一数字 的数据库对象。

1. 简单序列

create sequence '序列名称';
通过序列的伪列访问序列值说明
NEXTVAL返回序列的下一个值
CURRVAL返回序列的当前值
  • 注意:在刚建立序列后,无法提取当前值,只有先提取下一个值时才能再次提取当前值。
    ORA-08002: sequence SEQ_TEST.CURRVAL is not yet defined in this session
-- 提取下一个值
select '序列名称'.nextval from dual;

-- 提取当前值
select '序列名称'.currval from dual;

2. 复杂序列

-- 创建序列名称
CREATE SEQUENCE 'sequence_name'
-- 递增`n`的序列(默认:`1`)
-- 如果`n`是正数就递增
-- 如果`n`是负数就递减
[INCREMENT BY 'n']
-- 开始值(递增默认是`minvalue`,递减默认是`maxvalue`)
[START WITH 'n'] 
-- 最大值
[{MAXVALUE 'n' | NOMAXVALUE}]
-- 最小值
[{MINVALUE 'n' | NOMINVALUE}]
-- 循环 | 不循环(默认:`NOCYCLE`)
[{CYCLE | 'NOCYCLE'}] 
-- 分配并存入到内存中(默认:`CACHE`)
[{'CACHE' 'n' | NOCACHE}]; 

3. 修改序列

  • 修改序列:使用 ALTER SEQUENCE 语句修改序列。
  • 不能修改序列的 START WITH 参数。
-- 修改序列最大值为`5000`
ALTER SEQUENCE '序列名称' MAXVALUE 5000 CYCLE;

-- 当前序列基础+10
alter sequence '序列名称' increment by 10;    
-- 当前序列基础-10
alter sequence '序列名称' increment by -10;   

4. 删除序列

DROP SEQUENCE '序列名称';    

二、序列案例


1. 有最大值的非循环序列

-- 错误语句
create sequence `seq_test`
increment by 10
-- 开始值小于最小值(10 < 20)
start with 10
maxvalue 300
minvalue 20;
  • 错误信息:是由于开始值小于最小值(开始值不能小于最小值)。
    ORA-04006: START WITH cannot be less than MINVALUE
    在这里插入图片描述
create sequence `seq_test`
increment by 10
start with 280
maxvalue 300
minvalue 5;
select seq_test.nextval from dual;
-- 280
select seq_test.nextval from dual;
-- 290
select seq_test.nextval from dual;
-- 300
select seq_test.currval from dual;
-- 300

select seq_test.nextval from dual;
  • 执行语句提取序列值。
    当序列值为 300(最大值)的时候,再次提取值,系统会报异常信息。
    ORA-08004: sequence SEQ_TEST.NEXTVAL exceeds MAXVALUE and cannot be instantiated
    在这里插入图片描述

2. 有最大值的循环序列

create sequence `seq_test_2`
increment by 10
start with 280
maxvalue 300 
minvalue 5
cycle;
  • 当序列当前值为 300(最大值),再次提取序列的值。
select seq_test_2.nextval from dual;
-- 280
select seq_test_2.nextval from dual;
-- 290
select seq_test_2.nextval from dual;
-- 300
select seq_test_2.currval from dual;
-- 300

select seq_test_2.nextval from dual;
-- 5
select seq_test_2.nextval from dual;
-- 15
  • 由此得出结论。
    循环的序列,第一次循环是从开始值开始循环,而第二次循环是从最小值开始循环。

-- 错误语句
create sequence seq_test_3
increment by 10
start with 10
minvalue 5
cycle;
  • 上面序列创建报错。
  1. 因为创建的是一个循环的序列。
  2. 所以必须指定最大值,否则会报错。
    ORA-04015: ascending sequences that CYCLE must specify MAXVALUE

3. 带缓存的序列

-- 错误语句
create sequence seq_test3
increment by 10
start with 10
maxvalue 300
minvalue 5
cycle
cache 50;   
  • 执行上面语句的意思是每次取出 50 个缓存值,但是执行会提示错误。
    ORA-04013: number to CACHE must be less than one cycle
    在这里插入图片描述
  • 错误提示的意思是:缓存设置的数必须小于每次循环的数。
  1. 缓存设定的值是 50,而最大值是 300。
  2. 因为 cache 是 50 次,但是每次增长值是 10。
  3. 这样 50 次缓存提取出的数是 500 (50*10)。

-- 错误语句
create sequence seq_test_3
increment by 10
start with 10
maxvalue 500
minvalue 10
cycle
cache 50;
  • 执行上面语句依然会提示上边的错误。
    ORA-04013: number to CACHE must be less than one cycle
  1. 因为还存在一个 minvalueminvaluemaxvalue 之间是 490 个数。
  2. 但是缓存是 500,也就是一次循环可以提取 490,而第二次循环就是 500 >= 500。

create sequence seq_test_3
increment by 10
start with 10
maxvalue 500
minvalue 9
cycle
cache 50;
  • 把最小值减 1,或把最大值加 1,都可以通过。

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑士梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值