什么是序列
序列:可供多个用户用来产生唯一数值的数据库对象
- 自动提供唯一的数值
- 共享对象
主要用于提供主键值
- 将序列值装入内存可以提高访问效率
语法
CREATE SEQUENCE sequence -- 创建序列名称
[INCREMENT BY n] -- 递增的序列值是 n 如果 n 是正数就递增,如果是负数就递减 默认是 1
[START WITH n] -- 开始的值,递增默认是 minvalue 递减是 maxvalue
[{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
nocycle
nocache;
查询序列
- 查询数据字典视图
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 之前指定
,否则会报CURRVAL 尚未在此会话中定义的错误。
序列应用
-- 序列seq,从0开始增长,每次增长1
Create sequence seq;
-- 序列 seq的下一个有效的值
Select seq.nextval from dual;
-- 使用序列作为表的主键进行插入
Insert into emp values(seq.nextval,’c’);
我们执行下列语句提取序列值,当序列值为 (最大值)的时候再次提取值,系统会报异常信息。
--一次缓存的数有多少 cache值*增长值
--一次循环的值不能小于 一次缓存的数
create sequence seq_test7
increment by 10
start with 10
minvalue 10
maxvalue 100
cache 20
使用序列
- 将序列值装入内存可提高访问效率
- 序列在下列情况下出现裂缝:
– 回滚
– 系统异常
– 多个表同时使用同一序列 - 如果不将序列的值装入内存(NOCACHE), 可使用表 USER_SEQUENCES 查看序列当前的有效值
修改序列
修改序列的增量, 最大值, 最小值, 循环选项, 或是否装入内存
alter sequence dept_deptid_seq
increment by 20
maxvalue 999999
nocache
nocycle;
修改序列的注意事项
- 必须是序列的拥有者或对序列有 ALTER 权限
- 只有将来的序列值会被改变
改变序列的初始值只能通过删除序列之后重建序列的方法实现
删除序列
使用 DROP SEQUENCE
语句删除序列
删除之后,序列不能再次被引用
drop sequence dept_deptid_seq;