ITPub博客

首页 > 数据库 > Oracle > SEQUENCE自增列

SEQUENCE自增列

原创 Oracle 作者:静以致远√团团 时间:2014-04-21 09:08:52 0 删除 编辑

SEQUENCE就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方

 

创建SEQUENCE语法如下:



一旦定义了SEQUENCE,你就可以用CURRVALNEXTVAL
CURRVAL=返回?SEQUENCE的当前值
NEXTVAL=增加  SEQUENCE的值,然后返回 SEQUENCE 
比如:
SEQUENCE_NAME.CURRVAL
SEQUENCE_NAME.NEXTVAL

例如:

 

SQL> conn scott/oracle

Connected.

SQL> create sequence seq_test

  2  increment by 10

  3  start with 10

  4  nomaxvalue

  5  /

 

SQL> select seq_test.nextval from dual;

   NEXTVAL

----------

        10

 

SQL> select seq_test.nextval from dual;

   NEXTVAL

----------

        20

 

SQL> select seq_test.currval from dual;

   CURRVAL

----------

        20

 

修改SEQUENCE

 

SQL> alter sequence seq_test

  2  increment by 5

  3  maxvalue 9999

  4  cycle

  5  cache 10

  6  /

 

Sequence altered.

 

SQL> select seq_test.currval from dual;

   CURRVAL

----------

        20

 

SQL> select seq_test.nextval from dual;

   NEXTVAL

----------

        25

 

SQL> select seq_test.nextval from dual;

   NEXTVAL

----------

        30


关于cache参数的理解:

如果指定CACHE值,Oracle就可以预先在内存里面放置一些Sequence,这样存取的快些。cache里面的取完后,Oracle自动再取一组到cache。使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的Sequence就会丢失。举个例子:比如你的sequencecache 100,那当你sequence取到90时突然断电,那么在你重启数据库后,sequence的值将从101开始。

 

如果指定NOCACHE值,Oracle就不会预先在内存里面存放Sequence,当然这也就可以避免数据库不正常down掉的sequence丢失。不过会产生一些问题:创建nocache   sequence在高并发访问时,容易导致row cache lock等待事件,主要原因是每次获取nextval时都需要修改rowcache中的字典信息。使用nocache  sequence,还会导致如下问题:
由于每次修改字典信息都需要commit,可能导致log file sync等待,nocache sequenceRAC环境下,会对基于sequence生成的列创建的索引造成实例间大量索引块争用

 

基于以上问题,避免创建nocache sequence

 
 cycle/nocycle用于控制是否循环:

如:
SQL> alter sequence seq_test
  2  increment by 10
  3  maxvalue 100
  4  nocycle
  5  cache 10
  6  /

Sequence altered.
SQL> select seq_test.nextval from dual;
   NEXTVAL
----------
       100


SQL> select seq_test.nextval from dual;
select seq_test.nextval from dual
*
ERROR at line 1:
ORA-08004: sequence SEQ_TEST.NEXTVAL exceeds MAXVALUE and cannot be
instantiated

如果只想cycle将会循环该自增列:
SQL> alter sequence seq_test 
  2  increment by 10
  3  maxvalue 100
  4  cycle 
  5  cache 10
  6  /
Sequence altered.

SQL> select seq_test.nextval from dual;
   NEXTVAL
----------
         1

SQL> select seq_test.nextval from dual;
   NEXTVAL
----------
        11
需要注意的是,如果没有指定minvalue的值,在再次循环该sequence时会从1开始



 

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

上一篇: isqlplus乱码问题
下一篇: CURSOR
请登录后发表评论 登录
全部评论
每个人都有梦想,去实现吧!

注册时间:2013-11-14

  • 博文量
    164
  • 访问量
    2103390