Oracle中的序列(sequence)

在Oracle数据库中,序列(sequence)其实就是一个序列号生成器,它可以为表中的行自动生成序列号,主要的用途是生成表的主键值。相当于SQL Server和MySQL中的自增字段。在SQL Server中可以在定义主键时使用identity关键字定义,在MySQL中可以在定义主键时使用increment关键字定义。在Oracle数据库中要想使用自增字段,必须先定义一个序列(sequence)对象,然后在插入数据时使用【序列对象名.nextval】在主键中插入自增数据。

一、定义序列

要定义序列,则定义序列的用户必须具有CREATE SEQUENCE权限。在Oracle数据库中,定义序列的语法如下:

CREATE SEQUENCE 序列名 
[START WITH n] 
[INCREMENT BY n]
[MAXVALUE n|NOMAXVALUE]
[MINVALUE n|NOMINVALUE]
[CACHE n|NOCACHE]
[CYCLE|NOCYCLE]

参数说明:
(1)INCREMENT BY:定义序列的步长,n如果为正值,表示序列是一个递增序列;n如果为负值,表示序列是一个递减序列;如果省略,则默认值为1。
(2)START WITH:定义序列的起始值,如果省略,则默认值为1。
(3)MAXVALUE:定义序列生成器能产生的最大值。选项NOMAXVALUE是默认选项,代表没有最大值定义,这时对于递增序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。
(4)MINVALUE:定义序列生成器能产生的最小值。选项NOMAXVALUE是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是-10的26次方;对于递增序列,最小值是1。
(5)CYCLE|NOCYCLE:表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。
(6)CACHE:定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。

举例:

23:32:07 SQL> create sequence seq1 start with 1 increment by 1 minvalue 1 maxvalue 100000000 cache 50;
Sequence created.

23:49:09 SQL> create sequence seq2 start with 1001 increment by 2 nominvalue nomaxvalue;
Sequence created.

23:49:57 SQL> create sequence seq3 increment by -1;
Sequence created.

23:53:38 SQL> select * from user_sequences;

SEQUENCE_NAME			MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
SEQ1					1  100000000		1 N N	      50	   1
SEQ2					1 1.0000E+28		2 N N	      20	1001
SEQ3	       -1.000E+27	  -1	       -1 N N	      20	  -1
SEQ_EMPNO				1 1.0000E+28		1 N N	      50	8051
SEQ_STUID				1 1.0000E+28		1 N N	      20	   1

二、修改序列

格式:

ALTER SEQUENCE name [INCREMENT BY n]
    [MINVALUE n | NO MINVALUE] 
    [MAXVALUE n | NO MAXVALUE ]
    [MINVALUE n | NO MINVALUE ]
    [CACHE n ] 
    [CYCLE | NO CYCLE]

举例:

00:08:27 SQL> create sequence seq4;
Sequence created.

00:10:41 SQL> alter sequence seq4 increment by 2;
Sequence altered.

00:11:43 SQL> select * from user_sequences;
SEQUENCE_NAME			MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
SEQ4					1 1.0000E+28	    2 N N	      20	 101
SEQ_EMPNO				1 1.0000E+28		1 N N	      50	8051
SEQ_STUID				1 1.0000E+28		1 N N	      20	   1

00:18:44 SQL> alter sequence  seq4 maxvalue 2000000000;
Sequence altered.

00:19:34 SQL> alter sequence seq4 cache 30;
Sequence altered.

00:25:21 SQL> select * from user_sequences;

SEQUENCE_NAME			MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
SEQ4					1 2000000000		2 N N	      30	   2
SEQ_EMPNO				1 1.0000E+28		1 N N	      50	8051
SEQ_STUID				1 1.0000E+28		1 N N	      20	   1

三、删除序列

删除序列的语法如下:

DROP SEQUENCE 序列名;

举例:

00:06:30 SQL> drop sequence seq3;

Sequence dropped.

四、序列的使用

1、调用NEXTVAL将生成序列中的下一个序列号,调用时要指出序列名,格式如下:

序列名.NEXTVAL

2、CURRVAL用于产生序列的当前值,调用CURRVAL的格式如下:

序列名.CURRVAL

举例:

00:26:51 SQL> create table student(s_id int primary key,name varchar2(20));
Table created.

00:32:49 SQL> create sequence seq_sid minvalue 1001 increment by 1 start with 1001;
Sequence created.

00:33:52 SQL> insert into student(s_id,name) values(seq_sid.nextval,'tom');
1 row created.

00:34:28 SQL> insert into student(s_id,name) values(seq_sid.nextval,'jack');
1 row created.

00:34:34 SQL> select * from student;

      S_ID NAME
---------- --------------------
      1002 tom
      1003 jack
      
00:34:40 SQL> select seq_sid.currval from dual;

   CURRVAL
----------
      1003