Oracle的sequence
概述
Oracle的sequence,就是序列号,它提供一系列的按照事先指定的方式进行增长的数字。oracle sequence的最大值是38个整数。【Sequences are database objects from which multiple users can generate unique integers.】。一般来说,sequence常用于生成数据库的主键。
Oracle将sequence的定义存储在数据字典之中,因此,所有的sequence都在数据库的SYSTEM表空间里面。
引用sequence的当前值使用CURRVAL,而生成sequence的下一个值使用NEXTVAL来实现。初始化一个刚刚新建的sequence使用NEXTVAL,它会返回新sequence的第一值。另外还要注意,在一个全新的会话中,使用CURRVAL之前必须至少使用一次NEXTVAL。
sequence是独立于表的,也就是说一个sequence可以同时被多个表使用来生成主键。
sequence是独立于事务的,就是说序列的增加不需要等待事务的完成,也就是说序列是异步于事务而增长的。这种现象就说明,如果你根本访问不了别的用户用sequence产生的值,也就是说你只能访问到你当前产生的值,即使其他用户已经增加了sequence的值;还说明如果你事务回滚,sequence不会回滚,它所发生的改变是一维的。请看一个例子:
-- session 1
SQL> select distinct sid from v$mystat;
SID
----------
147
SQL> create sequence seqtest;
Sequence created.
SQL> select seqtest.nextval from dual; -- 第一次初始化sequence
NEXTVAL
----------
1
SQL> select seqtest.nextval from dual;
NEXTVAL
----------
2
-- session 2
SQL> select distinct sid from v$mystat;
SID
----------
143
SQL> select seqtest.currval from dual; -- 在一个新会话中,第一次使用currval之前必须先使用nextval
select seqtest.currval from dual
*
ERROR at line 1:
ORA-08002: sequence SEQTEST.CURRVAL is not yet defined in this session
SQL> select seqtest.nextval from dual; -- 是sequence值增加1
NEXTVAL
----------
3
-- session 1,虽然这个时候session已经增加了sequence的值,但是session 1只能看到自己增加的sequence的部分。
SQL> select seqtest.currval from dual;
CURRVAL
----------
2
如果在一个语句中,有多个部分使用了NEXTVAL,那么只有第一个NEXTVAL会使sequence改变一次,其他的不会是sequence发生变化。请看:
SQL> select seqtest.nextval,seqtest.nextval,seqtest.nextval from dual;
NEXTVAL NEXTVAL NEXTVAL
---------- ---------- ----------
5 5 5
sequence可以在下列场合中使用:
1. VALUES clause of INSERT statements
2. The SELECT list of a SELECT statement
3. The SET clause of an UPDATE statement
而不能在下列场合使用:
■ A subquery
■ A view query or materialized view query
■ A SELECT statement with the DISTINCT operator
■ A SELECT statement with a GROUP BY or ORDER BY clause
■ A SELECT statement that is combined with another SELECT statement with the UNION, INTERSECT, or MINUS set operator
■ The WHERE clause of a SELECT statement
■ DEFAULT value of a column in a CREATE TABLE or ALTER TABLE statement
■ The condition of a CHECK constraint
在平时中,更应该注意的是这些不能使用的情况。
创建
要想创建自己的序列,你必须拥有CREATE SEQUENCE 权限;如果是创建其他用户的序列,你则必须要拥有CREATE ANY SEQUENCE权限。下面,我们来看一下创建语法:
INCREMENT BY:用于指定sequence的一次变化量,它可以是正整数(此时表示序列变化是增加)和任何负整数(此时表示序列变化是减小),但是不能为零。这个数字的个数必须是小于或者等于28个数字,且这个值的绝对值必须介于MAXVALUE和MINVALUE之间。如果你没有指定这个值,那么就是1。
START WITH :指定sequence的第一个值,同样这个数字的个数也必须是小于或者等于28个。如果没有指定这个值,对于升序序列,它就是MINVALUE;而对于降序序列,它就是MAXVALUE。
MAXVALUE:指定sequence的最大值,它的个数必须是小于或者等于28个数字,它必须大于或者等于START WITH指定的值,且必须大于MINVALUE。
NOMAXVALUE:表示最大值是“无限”,对于升序序列是1027,而对于降序序列是-1。
MINVALUE:指定sequence的最小值,它的个数必须是小于或者等于28个数字,它必须小于或者等于START WITH指定的值,且必须小于MAXVALUE。
NOMINVALUE:表示最小值是“无限”,对于升序序列是1,而对于降序序列是-1026。
CYCLE/NOCYCLE:指定当序列达到最大(升序序列)和最小(降序序列)值的时候,序列是否要循环使用。
ORDER/NOORDER:默认情况下是NOORDER,这两个参数控制着序列是否按照顺序生成。只有在RAC环境中,这两个参数才有相应的实际意义。
CACHE/NOCACHE:
cache指定一次从数据字典中预分配多少个值,然后把这些值放在内存中以提供访问,这样就能提高访问速度。当内存中的值全部被使用完毕以后,再从数据字典中预分配这些值并且cache到内存,如此往复。同样,cache指定的这个数字的必须是少于28个,且其最小值是2。
两个重要的概念:
The Number of Entries in the Sequence Cache :When an application accesses a sequence in the sequence cache, the sequence numbers are read quickly. However, if an application accesses a sequence that is not in the cache, then the sequence must be read from disk to the cache before the sequence numbers are used.
The Number of Values in Each Sequence Cache Entry :When a sequence is read into the sequence cache, sequence values are generated and stored in a cache entry. These values can then be accessed quickly. The number of sequence values stored in the cache is determined by the CACHE parameter in the CREATE SEQUENCE statement. The default value for this parameter is 20.
可见sga中的sequence cache放的是sequence cache entries(就是许多sequece的cache),而一个sequence cache entry中存放了这个sequence的多个values(单个sequence的多个value)。CACHE参数就是控制着单个sequence可以缓存多少value的。默认值是20,即你不指?ACHE,也不指定NOCACHE,那么就表示CACHE=20。
当使用NOCACHE的时候,这样这个sequence的就不会缓存到内存,于是对它的每一次访问都会导致一个物理读和一个逻辑读。
使用CACHE参数,是否会带来相关的隐患呢?答案是肯定有的。当发生实例失败的时候,在内存中的那些sequence值都会丢失,也就是出现了sequence的“跳跃”。还有当在EXP/IMP的时候,如果在exp执行期间仍然有事务在访问该sequence,则次sequence也可能会出现“跳跃”。
有关CACHE参数值的设定,还有一个限制:
For sequences that cycle, this value must be less than the number of values in the cycle. You cannot cache more values than will fit in a given cycle of sequence numbers. Therefore, the maximum value allowed for CACHE must be less than the value determined by the following formula:
(CEIL (MAXVALUE - MINVALUE)) / ABS (INCREMENT)
修改
要想修改自己的序列,你必须拥有ALTER SEQUENCE 权限;如果是修改其他用户的序列,你则必须要拥有ALTER ANY SEQUENCE权限。下面,我们来看一下修改语法:
删除
要想删除自己的序列,你必须拥有DROP SEQUENCE 权限;如果是删除其他用户的序列,你则必须要拥有DROP ANY SEQUENCE权限。下面,我们来看一下删除语法:
有关sequence的视图
seq$
user_sequences
all_sequences
dba_sequences
seq
FAQ
如何增加sequence到指定的值?
由于sequence的值只能安装增加的比例增加,所以一种方法就是利用plsq的循环来实现,如下:
declare
mein number;
begin
for i in 149 .. 2000 loop
select SEQ_BMW_PUNISH_PERMISSION_R_ID.nextval into mein from dual;
end loop;
dbms_output.put_line(\'ok\');
end;
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:小霸王 来源: ilonng
- 标签: sequence
- 发布时间:2009-10-12 10:10:16
- [55] Oracle MTS模式下 进程地址与会话信
- [55] IOS安全–浅谈关于IOS加固的几种方法
- [54] 如何拿下简短的域名
- [53] android 开发入门
- [52] 图书馆的世界纪录
- [52] Go Reflect 性能
- [49] 读书笔记-壹百度:百度十年千倍的29条法则
- [47] 【社会化设计】自我(self)部分――欢迎区
- [38] 程序员技术练级攻略
- [32] 视觉调整-设计师 vs. 逻辑