ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 详解序列(sequence)

详解序列(sequence)

原创 Linux操作系统 作者:pingley 时间:2012-02-07 17:40:47 0 删除 编辑
详解序列(sequence)
sequences(序列):系列用于产生一系列的整数,用于辅助组织机构的内部控制(审计与追踪)或者简单的用作主键。
当用序列来产生主键值的时候,该主键通常被叫做代理主键。相应的还有自然主键一说。
创建序列的语法格式:
CREATE SEQUENCE sequencename
[INCREMENT BY value]
[START WITH value]
[{MAXVALUE value | NOMAXVALUE}]
[{MINVALUE value | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{ORDER | NOORDER}]
[{CACHE value | NOCACHE}];
创建序列的语法中大部分语句是可选的。

Create sequence 后面的序列名一般是以“_seq”结尾的,方便将来的标识。
INCREMENT BY 表示两个序列之间的间隔(interval),默认是增加1,可以根据业务的需要调整间隔。
指定正数表示是升序的,负数表示是降序的。
START WITH 表示序列的起点值,默认是1.可以根据业务的需求设定。如果在一个已经存在编号的表中引入序列,
确保所创建的序列的起点值大于表中最大的编号值。
如果一个序列是递增的使用MINVALUE没有意义。此时序列的最小值是START(起点)值。
如果序列式递减的如果你设置了MINVALUE值,MAXVALUE值也应该设定,一般与START值保持一致。
如果不指定最小值与最大值,oracle默认使用NOMAXVALUE与NOMINVALUE值。
oracle 序列的默认值:
对一个递增序列,NOMINVALUE的值是1.对于一个递减序列NOMINVALUE的值是-10^26
对一个递增序列,NOMAXVALUE的值是10^26,对于一个递减序列NOMAXVALUE的值是-1.
CYCLE 与 NOCYCLE选项,表示当序列到达了最大值或者最小值的时候,是否循环使用序列值。
注意如果序列是用作主键值得话,使用循环选项会产生问题。然而有些组织循环使用这些序列值,
因为他们不想让序列值无限的增大。Oracle默认是不启用循环。如果序列值耗尽,用户或者程序获取序列值的时候会返回错误。
ORDER 与NOORDER,oracle默认是不启用order的,也就是说默认使用noorder。
Order表示按照收到请求序列值的先后顺序返回相应的序列值。
比如A用户先请求,B用户后请求,如果序列值是递增的,那么A用户获得值如果是10,那么B用户获得的值就是11了。
CACHE与NOCACHE,如果要在短期内产生大量的序列值,会消耗系统比较多的资源,使系统的性能变差。
如果使用的是CACHE选项,oracle一次会一次产生一组值,然后把他们放在内存中缓存起来。
如果使用的是NOCACHE选项,则是收到一个请求产生一个值。如果用户在创建序列的时候,没有指定该项,
oracle默认使用CACHE 20。也就是在内存中缓存20序列值供使用。

序列值之间产生间隔(gap)的原因:
序列值产生以后数据库系统崩溃,重启后这些崩溃时未被利用的序列值。不能再生。
回滚操作引起的序列值间隔。
由于序列值是一个独立的对象。其他用户或者表使用该序列,会引起序列值的间隔。
一个序列值产生以后就不能再次产生。除非等下一次循环。如果序列值是当做主键的值来使用的,间隔是无关紧要的问题。
序列是一个独立的对象,不依附于某一张表,某一列,不同的用户,不同的表也可以使用相同的序列。
如果序列是用于审计跟踪,序列是由一张表独享的,并且设置为NOCACHE。

SQL> create sequence orders_order#_seq
  2  increment by 1
  3  start with 1000
  4  nocache
  5  nocycle
  6  order;
Sequence created.

使用数据字典视图user_sequenes查询相关序列的详细信息
SQL> select * from user_sequences
  2  where sequence_name='ORDERS_ORDER#_SEQ';
SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
ORDERS_ORDER#_SEQ                       1 1.0000E+28            1 N Y          0        1000

使用nextval,currval伪列来获得orders_order#_seq的值,nextval用于获得下一个值,currval用于保存最新获得的值。
当一个用户刚登陆到数据库currval值是空的,需要先产生nextval。
SQL> select orders_order#_seq.nextval from dual;
   NEXTVAL
----------
      1000
SQL> select orders_order#_seq.currval from dual;
   CURRVAL
----------
      1000
SQL> desc customers
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 CUSTOMER#                                 NOT NULL NUMBER(4)
 LASTNAME                                  NOT NULL VARCHAR2(10)
 FIRSTNAME                                 NOT NULL VARCHAR2(10)
 ADDRESS                                            VARCHAR2(20)
 CITY                                               VARCHAR2(12)
 STATE                                              VARCHAR2(2)
 ZIP                                                VARCHAR2(5)
 REFERRED                                           NUMBER(4)
 REGION                                             CHAR(2)
 EMAIL                                              VARCHAR2(30)
SQL> insert into customers
  2  values(orders_order#_seq.nextval, 'MORALES', 'BONITA', 'P.O. BOX 651', 'EASTPOINT', 'FL', '32328', NULL, 'S         E', 'bm225@sat.net');
1 row created.
orders_order#_seq序列为客户表的客户ID(customer#)列提供数值。
SQL> select customer#
  2  from customers;
 CUSTOMER#
----------
      1001
      
序列可以使用alter sequence 语句修改.但是start with 子句在序列修改中是不能使用的。
其他选项和序列的创建没有其别。
同时序列的修改不能使以前产生的序列值无效。
SQL> select * from user_sequences
  2  where sequence_name='ORDERS_ORDER#_SEQ';
SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
ORDERS_ORDER#_SEQ                       1 1.0000E+28            1 N Y          0        1002
其中last_number列会保存下一个产生的序列值。
需要删除某个序列的时候可以使用drop sequence sequence_name;
SQL> drop sequence orders_order#_seq;
Sequence dropped.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26110315/viewspace-715776/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    169
  • 访问量
    717596