一、序列介绍

  • 序列是 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,都可以通过。