oracle数据库对象-序列

序列(sequence)是oracle数据库对象中的一个,每次使用时它会自动增加(或减少)。

1、创建序列
语法:

CREATE SEQUENCE sequence_name
  [INCREMENT BY n]
  [START WITH n]
  [{MAXVALUE n | NOMAXVALUE}] 10^27
  [{MINVALUE n | NOMINVALUE}] -10^27
  [{CYCLE | NOCYCLE }]
  [{CACHE n | NOCACHE}];


说明:
INCREMENT BY:每次加几个
START WITH:从几开始
MAXVALUE:最大值是多少,或NOMAXVALUE不设置最大值
MINVALUE:最小值是多少,或NOMINVALUE不设置最小值
CYCLE:累加到最大值之后循环,或NOCYCLE一直累加不循环
CACHE:设置内存里缓存多少个序列,如果系统down掉了内存中的序列会丢失,导致序列跳号,也可以设置为NOCACHE不缓存

创建语句:

create sequence seq1
increment by 1
start with 1
maxvalue 999999
minvalue 1
cycle
nocache;

这个序列的值从1到999999递增循环。

2、使用序列
在表中使用两个伪列nextval、currval来使用创建好的序列。

nextval会返回下一个可用的序列值,每一次被引用时,nextval都会返回一个唯一值。
currval会获取当前的序列值。

SQL> select seq1.nextval from dual;

   NEXTVAL
----------
	 1

SQL> select seq1.currval from dual;

   CURRVAL
----------
	 1

SQL> select seq1.nextval from dual;

   NEXTVAL
----------
	 2


只要使用了nextval序列的值就自动加1。

3、往表中插入序列

SQL> create table STU2 (
id number,
name varchar2(40)
);

Table created.

SQL> insert into STU2 values (seq1.nextval, 'testtest');

1 row created.

SQL> select * from STU2;

	ID NAME
---------- ----------------------------------------
	 4 testtest


修改id字段的数据类型:

delete from STU2;
alter table STU2 modify id char(1);

SQL> insert into STU2 values (seq1.nextval, 'test2test2');

1 row created.

SQL> select * from STU2;

I NAME
- ----------------------------------------
5 test2test2


插入时,数字型和字符型oracle会自动做转换,序列像一个组件一样在插入记录时直接拿来用。

4、删除序列

drop sequence seq1;

5、使用NEXTVAL和CURRVAL的规则

可以在下列上下文中使用NEXTVAL和CURRVAL:
不是子查询一部分的SELECT语句的SELECT列表
INSERT语句中子查询的SELECT列表
INSERT语句的VALUES子句
UPDATE语句的SET子句

不能在下列上下文中使用NEXTVAL和CURRVAL:
视图的SELECT列表
带有DISTINCT关键字的SELECT语句
带有GROUP BY、HAVING或ORDER BY子句的SELECT语句
SELECT、DELETE或UPDATE语句中的子查询
CREATE TABLE或ALTER TABLE语句中的DEFAULT表达式

参考资料:
http://www.cnblogs.com/hyzhou/archive/2012/04/12/2444158.html