SEQUENCE自增列
2016-03-13 16:08
316 查看
SEQUENCE就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方
创建SEQUENCE语法如下:
![](http://blog.itpub.net/attachment/201404/21/29320885_13980416801u0U.png)
一旦定义了SEQUENCE,你就可以用CURRVAL,NEXTVAL
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就会丢失。举个例子:比如你的sequence中cache 100,那当你sequence取到90时突然断电,那么在你重启数据库后,sequence的值将从101开始。
如果指定NOCACHE值,Oracle就不会预先在内存里面存放Sequence,当然这也就可以避免数据库不正常down掉的sequence丢失。不过会产生一些问题:创建nocache sequence在高并发访问时,容易导致row cache lock等待事件,主要原因是每次获取nextval时都需要修改rowcache中的字典信息。使用nocache sequence,还会导致如下问题:
由于每次修改字典信息都需要commit,可能导致log file sync等待,nocache sequence在RAC环境下,会对基于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开始
创建SEQUENCE语法如下:
![](http://blog.itpub.net/attachment/201404/21/29320885_13980416801u0U.png)
一旦定义了SEQUENCE,你就可以用CURRVAL,NEXTVAL
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就会丢失。举个例子:比如你的sequence中cache 100,那当你sequence取到90时突然断电,那么在你重启数据库后,sequence的值将从101开始。
如果指定NOCACHE值,Oracle就不会预先在内存里面存放Sequence,当然这也就可以避免数据库不正常down掉的sequence丢失。不过会产生一些问题:创建nocache sequence在高并发访问时,容易导致row cache lock等待事件,主要原因是每次获取nextval时都需要修改rowcache中的字典信息。使用nocache sequence,还会导致如下问题:
由于每次修改字典信息都需要commit,可能导致log file sync等待,nocache sequence在RAC环境下,会对基于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开始
相关文章推荐
- 设置GUI中Label的字体大小
- 用while(true)和continue、break来实现在一个大循环里switch
- STL list和deque
- NSThread、NSOperation/NSOperationQueue、GCD多线程
- Deep learning:四十四(Pylearn2中的Quick-start例子)
- poj-2478 Farey Sequence(dp,欧拉函数)
- iOS8新特性之基于地理位置的消息通知UILocalNotification
- Java中的continue、break和return
- Pop Sequence
- 子线程更新UI
- This Android SDK requires Android Developer Toolkit version 23.0.0 or above
- pintuer e.handler.apply is not a function
- 《iOS Human Interface Guidelines》——Map View
- How to Advertise Android as a Bluetooth LE Peripheral
- java中线程队列BlockingQueue的用法
- C#中扩展StringBuilder支持链式方法
- 02-线性结构3 Pop Sequence
- 使用LinkedList实现Stack与Queue
- UINavigationController, UITabBarController
- android 6.0 SystemUI源码分析(6)-StorageNotification介绍