基本概念
- 自动提供唯一的数值
- 共享对象
- 主要用于提供主键值
将序列值装入内存可以提高访问效率
放在内存中速度快
auto_increment
[ 1,2,3,4......20 ]
▲
CREATE SEQUENCE 语句
定义序列:
CREATE SEQUENCE sequence
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];
创建序列
- 创建序列 DEPT_DEPTID_SEQ为表 DEPARTMENTS 提供主键
- 不使用 CYCLE 选项
CREATE SEQUENCE dept_deptid_seq INCREMENT BY 10 START WITH 120 MAXVALUE 9999 NOCACHE NOCYCLE;
Sequence created.
create sequence myseq;
查询序列
SELECT sequence_name,min_value,max_value,increment_by,last_number FROM user_sequences;
- 如果指定NOCACHE 选项,则列LAST_NUMBER 显示序列中下一个有效的值
NEXTVAL 和 CURRVAL 伪列
- NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用
- CURRVAL 中存放序列的当前值
NEXTVAL 应在 CURRVAL 之前指定 ,二者应同时有效
应用:
INSERT INTO departments(department_id,department_name,location_id) VALUES (dept_deptid_seq.NEXTVAL,'Support',2500);
1 row created.
序列 DEPT_DEPTID_SEQ 的当前值
SELECT dept_deptid_seq.CURRVAL FROM dual;
使用序列
- 将序列值装入内存可提高访问效率
- 序列在下列情况下出现裂缝:
- 回滚
- 系统异常
- 多个表同时使用同一序列
- 如果不将序列的值装入内存(NOCACHE),可使用表 USER_SEQUENCES 查看序列当前的有效值
修改序列
修改序列的增量,最大值,最小值,循环选项,或是否装入内存
ALTER SEQUENCE dept_deptid_seq INCREMENT BY 20 MAXVALUE 999999 NOCACHE NOCYCLE;
Sequence altered.
注意事项
删除序列
DROP SEQUENCE dept_deptid_seq;
Sequence dropped.
综合实例
创建序列
create sequence myseq;
创建表
create table tableA ( tid number,tname varchar2(40) );
- 从序列中取nextval,产生tableA的主键值
insert into tableA values(myseq1.nextval,'aa');
序列的两个属性 NEXTVAL CURRVAL nextval应在currval之前被指定:
sql> select myseq.currval from dual;
select myseq.currval from dual
*
第 1 行出现错误:
ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此会话中定义
select myseq.nextval from dual
select myseq.currval from dual
- 删除序列
drop sequence myseq;
序列需要注意的问题
- 多个表共用一个序列,造成序列不连续
- 回滚会造成,造成序列不连续
- 系统异常,内存序列丢失,造成序列不连续