一、序列介绍
- 序列是
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;
- 上面序列创建报错。
- 因为创建的是一个循环的序列。
- 所以必须指定最大值,否则会报错。
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- 错误提示的意思是:缓存设置的数必须小于每次循环的数。
- 缓存设定的值是 50,而最大值是 300。
- 因为
cache
是 50 次,但是每次增长值是 10。- 这样
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
- 因为还存在一个
minvalue
,minvalue
和maxvalue
之间是 490 个数。- 但是缓存是 500,也就是一次循环可以提取 490,而第二次循环就是 500 >= 500。
create sequence seq_test_3
increment by 10
start with 10
maxvalue 500
minvalue 9
cycle
cache 50;
- 把最小值减 1,或把最大值加 1,都可以通过。