您的位置:首页 > 产品设计 > UI/UE

SEQUENCE自增列

2016-03-13 16:08 316 查看
SEQUENCE就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方

创建SEQUENCE语法如下:



一旦定义了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开始
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: