序列(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表达式