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
【Oracle的sequence】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权限 。 下面 , 我们来看一下创建语法:
Oracle的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 。