序列

一、前言

数据库表中的主键值有的时候我们会用数字类型的并且自增。这样mysql、sql server中的都可以使用工具创建表的时候很容易实现。但是oracle中没有设置自增的方法,一般情况我们会使用序列和触发器来实现主键自增的功能。

二、定义

序列: Sequence 是oracle提供的用于产生一系列唯一数字的数据库对象。
~自动提供唯一的数值。
~共享对象。
~主要用于提供主键值。
~将序列值装入内存可以提高访问效率。

三、序列操作

1.定义序列
CREATE SEQUENCE sequence
[INCREMENT BY n] –每次增长的数值
[START WITH n] –从哪个值开始
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}] –是否需要循环
[{CACHE n | NOCACHE}]; –是否缓存登录
2.创建序列
创建序列 DEPT_DEPTID_SEQ为表 DEPARTMENTS 提供主键,不使用 CYCLE 选项。
CREATE SEQUENCE dept_deptid_seq
INCREMENT BY 10
START WITH 120
MAXVALUE 9999
NOCACHE
NOCYCLE;
Sequence created.
3.查询序列
查询数据字典视图 USER_SEQUENCES 获取序列定义信息。
SELECT sequence_name,min_value,max_value,increment_by, last_number FROM user_sequences;
如果指定NOCACHE 选项,则列LAST_NUMBER 显示序列中下一个有效的值。
4.NEXTVAL 和 CURRVAL 伪列
NEXTVAL:返回序列中下一个有效的值,任何用户都可以引用。
CURRVAL:中存放序列的当前值。
NEXTVAL:应在 CURRVAL 之前指定 ,否则会报CURRVAL 尚未在此会话中定义的错误。
5.使用序列
将序列值装入内存可提高访问效率
序列在下列情况下出现裂缝:
回滚、系统异常、多个表同时使用同一序列
如果不将序列的值装入内存(NOCACHE), 可使用表 USER_SEQUENCES 查看序列当前的有效值
6.修改序列
修改序列的增量, 最大值, 最小值, 循环选项, 或是否装入内存。

ALTER SEQUENCE dept_deptid_seq
               INCREMENT BY 20
               MAXVALUE 999999
               NOCACHE
               NOCYCLE;

注意事项:
a.必须是序列的拥有者或对序列有 ALTER 权限。
b.只有将来的序列值会被改变。
c.改变序列的初始值只能通过删除序列之后重建序列的方法实现。
7.删除序列
使用 DROP SEQUENCE 语句删除序列,删除之后,序列不能再次被引用。
DROP SEQUENCE dept_deptid_seq;

作者:liuyang  创建时间:2023-09-15 14:33
最后编辑:严锋  更新时间:2024-07-02 19:36