序列(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