共计 3186 个字符,预计需要花费 8 分钟才能阅读完成。
序列是一种数据库对象,用来自动产生一组唯一的序号。
序列是一种共享式的对象,多个用户可以共同使用序列中的序号。
一般将序列应用于表的主键列,这样当向表中插入数据时,主键列就使用了序列中的序号,从而保证主键列的值不会重复。
用这种方式可以代替在应用程序中产生主键值的方法,可以获得更可靠的主键值。
注:在序列指定最大值和可循环属性后,序列中的序号是可以循环使用的。
序列的创建、修改和删除
默认情况下,用户可以在自己的模式中创建序列。如果希望在其他用户的模式中创建序列,
则必须具有 CREATE ANY SEQUENCE 这个系统权限。
创建序列的命令为 CREATE SEQUENCE, 它的完整语法格式为:
CREATE SEQUENCE 序列名
INCREMENT BY n
START WITH n
MINVALUE n | NOMINVALUE
MAXVALUE n | NOMAXVALUE
CYCLE | NOCYCLE
CACHE | NOCACHE
ORDER | NOORDER
在这个命令的语法格式中,除序列名以外,其余各选项都是可选的。
各选项中的 n 是一个整数。
其中 START WITH 选项指定序列中的序号从哪个数字开始,默认情况下从它的最小值开始。
INCREMENT BY 选项指定了序列中序号递增的幅度,也就是后一个序号比前一个序号大多少。
序号可以递增,也可以递减,所以 INCREMENT BY 选项中的数字 n 可以是正整数,也可以是负整数。
MAXVALUE 用来指定序列中序号的最大值。
如果没有最大值,可用 NOMAXVALUE 选项代替这个选项。
同样,MINVALUE 用来指定序列中序号的最小值,序列中的最小值必须小于或等于它的开始值。
如果为序列指定了最大值,那么当序列中的序号被悄耗完时,用户将无法从这个序列中取得序号。
选项 CYCLE 使得序列中的序号可以循环使用。
当用户正在使用序列中的最大值时,下一个可以使用的序号就是它的最小值。
用户每使用序列一次,都要对序列进行一次查询。
如果把序列中的序号放在内存中进行缓冲,那么用户获得序号的速度将大大加快。
选项 CACHE 的作用就是将序列中接下来的 n 个序号在内存中进行缓冲。
如果不希望进行缓冲,可以用 NOCACHE 选项代替它。
序列在创建之后,在使用的过程中,可以对其进行修改。
比如修改它的最大值、最小值、增幅等,但是不能修改开始值。
需要注意的是,如果已经有部分序号被使用,那么对序列的修改只影响以后的序号,对以前已经使用的序号不起作用。
修改序列的命令是 ALTER SEQUENCE。
用户可以修改自己的序列,如果希望修改其他用户的序列,则需要具有 ALTER ANY SEQUENCE 这个系统权限。
ALTER SEQUENCE 命令的用法与 CREATE SEQUENCE 命令的用法基本相同,只要将关键字 CREATE 替换为 ALTER 即可。
删除序列的命令是 DROP SEQUENCE。
用户可以删除自己创建的序列,如果要删除其他用户的序列,则要具有 DROP ANY SEQUENCE 系统权限。
序列被删除后,它的相关信息就被从数据字典中删除。
序列的使用
对用户而言,序列中的可用资源是其中包含的序号。
用户可以通过 SELECT 命令获得可用的序号,也可以将序号应用于 DML 语句和表达式中。
如果要使用其他用户的序列,则 必须具有对该序列的 SELECT 权限。
序列提供了两个伪列,即 NEXTVAL 和 CURRVAL, 用来访问序列中的序号。
其中 NEXTVAL 代表下一个可用的序号,CURRYAL 代表当前的序号。
序列可以认为是包含了一系列序号的一个指针。
序列刚被创建时,这个指针位于第一个序号之前,以后每获得一个序号,指针就向后移动一个位置,这时就可以用 CURRVAL 访问序列中的当前序号,用 NEXTVAL 访问下一个序号。
在第一次使用序列中的序号时,必须首先访问 NEXTVAL 伪列,使指针指向第一个序号。
通过 SELECT 语句可以从序列中获得一个可用的序号。
例如:
SELECT seq1.nextval FROM dual;
在 SELECT 语句中使用表 dual 是必要的,因为 SELECT 语句将根据表中数据的行数返回若干个序号,并且每访问一次 NEXTVAL 伪列,指针就向后移动一个序号。
CURRVAL 伪列代表序列中的当前序号,访问这个伪列时指针并不向后移动。
CURRVAL 伪列的引用方法与 NEXTVAL 伪列相同,引用格式为:序列名.currval。
序列还可应用于 SELECT 语句的其他形式。
例如:
SELECT seq1.nextval, empno FROM scott.emp;
在更多情况下序列的作用为表中的主键列或其他列提供一个唯一的序号。
例如:
INSERT INTO scott.dept(deptno, dname) VALUES(seq1.nextval, ‘lili’);
序列是一种共享式的数据库对象,用户可以直接使用自己创建的序列,其他用户也可以访问当前用户的序列,只要具有对这个序列的 SELECT 权限即可。
如果一个序号被某个用户获得,那么其他用户就不能再获得这个序号了。
也就是说,序列是可以共享的,但序列中的序号却是不能共享的。
对序列中序号的访问操作是作为一个单独的事务实现的,这个事务的执行与其他事务的执行成功与否无关。
如果包含一条 DML 语句的事务被回滚了,那么对序列的操作是无法回滚的。
注:如果是在可循环的序列中,序号可被其他用户循环使用。
在访问序列中的序号时,可能会发生序号不连续的情况,不连续的原因可能是事务发生了回滚,或者多个用户共同访问同一个序列。
一个用户要访问其他用户的序列时,不仅要具有对这个序列的 SELECT 权限,在访问时还要在序列的名称前以用户名进行限定。
例如:
SELECT sys.seq1.nextval FROM dual;
如果要将一个序列的 SELECT 权限授予其他用户,相应的 GRANT 命令格式为:
GRANT SELECT ON 序列名 TO 用户名;
序列信息的查询
序列作为一种数据库对象,它的相关信息也存储在数据字典中。
与序列相关的数据字典有三个:USER_SEQUENCES、ALL SEQUENCES 和 DBA_SEQUENCES。
其中数据字典 USER SEQUENCES 的各列及意义如下所示:
SEQUENCE_NAME 序列名
MIN_VALUE 最小值
MAX_VALUE 最大值
INCREMENT_BY 增幅
CYCLE_FLAG 是否循环
ORDER_FLAG 是否按顺序
CACHE_SIZE 缓存大小
LAST_NUMBER 下一个可用值
注:ORDER_FLAG 的解释:
Note that the ORDER option is only necessary to guarantee ordered generation if you are using Oracle with the Parallel Server option in parallel mode.
If you are using exclusive mode, sequence numbers are always generated in order.
LAST_NUMBER 的解释:
使用的或缓存的最后一个序列号,一般大于缓冲区中的最后一个值。
LAST_NUMBER 列在普通的数据库操作过程中不被更新,它在数据库的重新启动 / 恢复操作中使用。
CACHE_SIZE 的解释:
在内存中缓存的序号用完之后,再向内存中添加序号。
例如:
SELECT order_flag, last_number,max_value,cache_size from user_sequences where sequence_name=’SEQ1′;
更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-05/131434.htm