sequence学习笔记

发表于: DB/ES | 作者: | 日期: 2008/11/22 08:11

sequence概述
模式对象的一种,能够以串行方式生成一系列顺序整数。其最大的有点是可以在多用户并发环境中为各个用户生成不会重复的顺序整数,基本上可以认为序列天生就是为主键而存在的。使用create sequence 语句创建序列之后,oracle将序列的定义描述存储在数据字典中,序列并不占用实际的存储空间。

sequence的创建
创建序列需要提供如下信息:
序列的名称
序列生成整数的顺序是升序还是降序
序列生成两个整数之间的间隔
oracle是否在内存中缓存序列生成的整数

语法:
CREATE SEQUENCE seq_table_name

可选参数如下:
INCREMENT BY 1 — 每次加几个
START WITH 1 — 从1开始计数
NOMAXvalue — 不设置最大值
NOCYCLE — 一直累加,不循环
NOCACHE–不设置缓存
CACHE 10; –设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续

sequence的变更
可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence 然后再重新创建。
ALTER SEQUENCE 的例子
ALTER SEQUENCE emp_sequence
INCREMENT BY 10
MAXvalue 10000
CYCLE — 到10000后从头开始
NOCACHE ;

sequence的使用
使用CURRVAL得到序列的当前值;使用NEXTVAL得到序列的下一个值,当前序列值也会随之改变。

可以使用sequence的地方:
– 不包含子查询、snapshot、VIEW的 SELECT 语句
– INSERT语句的子查询中
– INSERT语句的valueS中
– UPDATE 的 SET中

示例:
insert into table_name(id, name)values(seq_table_name.Nextval, ‘runto30’);

其他说明
序列只适合那些使用整数作为主键字段值的表。

第一次NEXTVAL返回的是初始值,随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值;
CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。

如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。

一个实际生产环境的序列示例

create sequence DBCALLADM.SEQ_12580
increment by 1
start with 10000
maxvalue 999999999
minvalue 1
cache 20;

: https://blog.darkmi.com/2008/11/22/535.html

本文相关评论 - 1条评论都没有呢
Post a comment now » 本文目前不可评论

No comments yet.

Sorry, the comment form is closed at this time.