Oracle其他数据对象 –- 序列
一 介绍
序列: 可供多个用户用来产生唯一数值的数据库对象
(1) 自动提供唯一的数值
(2) 共享对象
(3) 主要用于提供主键值
(4) 将序列值装入内存可以提高访问效率
二 实战:
1.创建序列:
1 create sequence seqEmp
2 increment by 1
3 start with 1
4 maxvalue 3
5 minvalue 1
6 cycle
7* cache 2
SQL> /
序列已创建。
注:
create 创建
sequence 序列
seqEmp 序列名
increment by 1 步长,递增的序列
start with 开始的值 起始值
maxvalue 3 最大值
minvalue 1 最小值
cycle 循环 | nocycle 不循环
cache 缓存值 (maxvalue-minvalue)/increment by值
比如:(10- 1)/2 =4.5,那么缓存值不能大于5
但是一般情况下不使用缓存,因为缓存会截断序列
nextvalue 取的下一个值
currval 当前值
2.一般情况下创建的序列:
1 create sequence sepDep
2 increment by 1
3 start with 1
4 maxvalue 10
5 minvalue 1
6 nocycle
7* nocache
SQL> /
序列已创建。
3.序列的查询
可通过查询数据字典视图user_sequences来获取序列定义的信息,为:
SQL> select * from user_sequences;
序列在创建之后要查询序列,在查询currval的时候首先要先查nextval之后,才可以查currval,要不会出错,如:
SQL> select sepDep.currval from dual;
select sepDep.currval from dual
*
第 1 行出现错误:
ORA-08002: 序列 SEPDEP.CURRVAL 尚未在此会话中定义
所以要先插nextval,如
SQL> select sepDep.nextval from dual;
NEXTVAL
----------
1
SQL> select sepDep.currval from dual;
CURRVAL
----------
1
SQL>
注:
(1) nextval 返回序列中下一个有效的值,任何用户都可以引用
(2) currval 中存放序列的当前值
(3) nextval 应在 currval 之前指定 ,二者应同时有效
4.修改序列
修改序列的增量, 最大值, 最小值, 循环选项, 或是否装入内存
SQL> alter sequence seqEmp maxvalue 5;
序列已更改。
SQL> alter sequence seqEmp nocycle nocache;
序列已更改。
SQL> alter sequence seqEmp minvalue 2;
序列已更改。
SQL> alter sequence seqEmp cycle;
序列已更改。
注:
(1)必须是序列的拥有者或对序列有 ALTER 权限
(2)只有将来的序列值会被改变
(3)改变序列的初始值只能通过删除序列之后重建序列的方法实现
(4)start with只能把表删除之后修改。
5. 删除序列
(1) 使用DROP SEQUENCE 语句删除序列
(2) 删除之后,序列不能再次被引用
删除的语句:
drop sequence sepDep(序列名)
6.序列的使用的注意事项
(1) 将序列值装入内存可提高访问效率
(2)序列在下列情况下出现裂缝:
• 回滚
• 系统异常
• 多个表同时使用同一序列
(2) 如果不将序列的值装入内存(NOCACHE), 可使用表 USER_SEQUENCES 查看序列当前的有效值
7.创建一个表,来指定序列
(1) 创建表
SQL> create table seqEmps(
2 id number(10),
3 name varchar2(30)
4 );
表已创建。
(2)创建序列
SQL> create sequence seqCre
2 increment by 1
3 start with 1
4 maxvalue 10
5 minvalue 1
6 nocycle
7 nocache
8 ;
序列已创建。
(3)向表中添加序列
SQL> insert into setEmps values(seqCre.nextval,'老王');
多执行几遍之后的效果为:
SQL> select * from seqEmps;
ID NAME
---------- ------------------------------
1 老王
2 老王
3 老王
4 老王
5 老王
6 老王
7 老王
已选择7行。
如果是多行的话,直接在values中添加即可,比如:
SQL> insert into seqEmps1 values(seqCre1.nextval,'老王','女');
效果为:
SQL> select * from seqEmps1;
ID NAME SEX
---------- ------------------------------ ----------
1 老王 女
2 老王 女
3 老王 女
4 老王 女
5 老王 女
6 老王 女
已选择6行。