基本概念
序列: 可供多个用户用来产生唯一数值的数据库对象
- 自动提供唯一的数值
- 共享对象
- 主要用于提供主键值
将序列值装入内存可以提高访问效率
放在内存中速度快
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;
查询序列
- 查询数据字典视图 USER_SEQUENCES 获取序列定义信息
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.
注意事项
- 必须是序列的拥有者或对序列有 ALTER 权限
- 只有将来的序列值会被改变
- 改变序列的初始值只能通过删除序列之后重建序列的方法实现
删除序列
- 使用DROP SEQUENCE 语句删除序列
- 删除之后,序列不能再次被引用
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;
序列需要注意的问题
- 多个表共用一个序列,造成序列不连续
- 回滚会造成,造成序列不连续
- 系统异常,内存序列丢失,造成序列不连续