SEQUENCE自增列

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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29320885/viewspace-1145813/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值