Sequence序列
- 序列是一种数据库对象。
- 用于产生唯一数字列值。
- 一般使用序列自动地生成主键或唯一键值。
- 序列可以是升序或降序。
- 每个序列可以建立多个序列。
语法
CREATE SEQUENCE [schema.]序列名
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n| NOMAXVALUE]
[MINVALUE n| NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n| NOCACHE];
序列语法说明
- 创建序列,必须有CREATE SEQUENCE或CREATE ANY SEQUENCE权限。
- 序列被创建后,可以通过查询数据字典视图USER_SEQUENCES查看序列信息。
- 当全部缺省时,则该序列为上升序列,由1开始,增量为1,没有上限,缓存中序列值个数为20。
- INCREMENT BY n:n可为正的或负的整数,但不可为0。默认值为1。
- START WITH n:指定生成的第一个序列号,默认为1。对于升序,默认为序列的最小值。对于降序,默认为序列的最大值。
- MAXVALUE n:指定n为序列可生成的最大值。
- NOMAXVALUE:为默认情况。指定升序最大值为1027,指定降序指定最大值为-1。
- MINVALUE n:指定n为序列的最小值。
- NOMINVALUE:为默认情况。指定升序默认最小值为1。指定降序默认最小值为-1026。
- CYCLE:指定序列使用循环。即序列达到了最大值,则返回最小值重新开始。默认为NOCYCLE。
- CACHE n:定义n个序列值保存在缓存中,默认值为20个。
实验25:序列的概念和使用
建立序列
SQL> create sequence s1
2 increment by 2
3 start with 1
4 maxvalue 10
5 minvalue -10
6 nocycle
7 nocache;
序列已创建。
查看序列
SQL> select * from user_sequences;
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
-------------- ---------- ---------- ------------ - - ---------- ------------
S1 -10 10 2 N N 0 1
引用序列的值
SQL> select s1.nextval from dual;--取序列s1的下一个值
NEXTVAL
----------
1
SQL> select s1.currval from dual;--取序列s1的当前值
CURRVAL
----------
1
建立一个和dept表结构相同,但不含任何行的空表。
SQL> drop table d purge;
表已删除。
SQL> create table d as select * from dept where 0=9;
表已创建。
SQL> select * from d;
未选定行
SQL> insert into d(deptno) values(s1.nextval);
已创建 1 行。
SQL> insert into d(deptno) values(s1.nextval);
已创建 1 行。
SQL> select * from d;
DEPTNO DNAME LOC
---------- -------------- -------------
3
5
修改序列
语法
ALTER SEQUENCE [schema.]序列名
[INCREMENT BY n]
[MAXVALUE n| NOMAXVALUE]
[MINVALUE n| NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n| NOCACHE];
- 必须是序列的所有者,或者有ALTER ANY SEQUENCE 权限才能修改序列。
- 修改序列的语法除没有START WITH子句外。
序列的当前值一定要在最大和最小之间。
步长不能为0。
SQL> alter sequence s1 increment by -2;
序列已更改。
SQL> alter sequence s1 cycle;
序列已更改。
序列值得不连续问题
事务回退,序列号不回退。
SQL> insert into d(deptno) values(s1.nextval);
已创建 1 行。
SQL> select * from d;
DEPTNO DNAME LOC
---------- -------------- -------------
3
5
3
SQL> rollback;
回退已完成。
SQL> insert into d(deptno) values(s1.nextval);
已创建 1 行。
SQL> select * from d;
DEPTNO DNAME LOC
---------- -------------- -------------
3
5
1
SQL> insert into d(deptno) values(s1.nextval);
已创建 1 行。
SQL> select * from d;
DEPTNO DNAME LOC
---------- -------------- -------------
3
5
1
-1
SQL> insert into dept(deptno) values(s1.nextval); --其他语句引用了该序列
已创建 1 行。
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
-3
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
cache 序列的值到内存中
nocache 每次取值都要计算
cache n 一次就放入内存n个值。默认时20。
SQL> alter sequence s1 cache 30;
alter sequence s1 cache 30
*
第 1 行出现错误:
ORA-04013: CACHE 值必须小于 CYCLE 值
SQL> alter sequence s1 cache 5;
序列已更改。
SQL> insert into d(deptno) values(s1.nextval);
已创建 1 行。
SQL> select * from user_sequences;
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
S1 -10 10 -2 Y N 5 -11
删除序列
语法
DROP SEQUENCE [schema.]序列名;
- 对序列的删除必须是序列的所有者或者具有DROP ANY SEQUENCE权限的用户才可以完成。
SQL> drop sequence s1;
序列已删除。
使用序列的原则
- 如果想使用序列做主键,请使用不可循环的序列。
- 如果想快速产生序列的值,将cache的值加大。
- 如果序列序列内的值要很长时间才能使用完,可以考虑使用可以循环的序列。
知识点
- 序列是共享的对象
- 主要用来产生主键