Oracle序列
序列(sequence)介绍
oracle中,是通过使用序列(sequence)来处理自动增长列。
(1)可以为表中的列自动产生值。
(2)由用户创建数据库对象,并可由多个用户共享。
(3)一般用于主键或唯一列。
PS:在SQL Server,MySQL中都是用非常简单的一条语句来实现自增长的,没有像在Oracle中这样定义成一个对象--序列(sequence)来进行使用。定义成对象的好处就是方便管理,效率更高。
创建序列基本语法:
create sequence 序列名称
start with 开始数字
increment by 增长数字
minvalue 最小值
maxvalue 最大值 | nomaxvalue 无穷大
cycle | nocycle
cache | nocache
详细说明:
start with 开始数字à从几开始
increment by 增长à步长,每次增长几个数
minvalue 最小值
maxvalue 最大值à可以不设置,不设置应写为nomaxvalue,也就是无穷大
cycle 循环,也就是说增长到最大值后,再从最小值开始重新增长 nocycle 不循环,也就是说增长到最大值后就停止增长
nocache 不设缓存,cache设置缓存,设置缓存的优点是提高效率,但是缺点就是当出现意外中断时,缓存中没有使用的序列数字将被舍弃
实例:
--创建一个序列
create sequence myseq1
start with 1 --初始值
increment by 1 --自增值
minvalue 1 --最小值
maxvalue 30000 --最大值
cycle --循环
nocache --不缓存
--创建表
create table test1
(
id number primary key,
name varchar2(30)
);
--使用序列
insert into test1 values(myseq1.nextval,'a');
insert into test1 values(myseq1.nextval,'a');
insert into test1 values(myseq1.nextval,'a');
select * from test1;
--查看序列到多少号了
select myseq1.currval from dual;
特别说明:
1、myseq1:表示序列的名字,nextval:关键字,表示从序列中取下一个值。
2、sequence序列是需要配合number类型的列来使用;
3、sequence序列是要在主键或unique列上使用的。
4、第一次使用nextval返回的是初始值;随后的nextval会自动增加你定义的increment by值,然后返回增加后的值;
5、currval总是返回当前sequence的值,但是在第一次nextval初始化之后才能使用currval,否则会出错。
6、使用一次nextval会增加一次sequence的值,所以如果你在同一个语句里面使用多个nextval,其值就是不一样的。
7、如果指定cache值,oracle就可以预先在内存里面放置一些sequence,这样存取效率更高。cache里面的取完后,oracle自动再取一组到cache。使用cache或许会跳号,比如数据库突然不正常down掉(shotdown abort),cache中的sequence就会丢失,所以可以在create sequence的时候用nocache防止这种情况。
使用sequence的情况
不包含子查询、snapshot/view的select的语句
insert语句的子查询中
insert语句的values中
update的set中
如:update 表名 列值=序列名.nextval where 条件;
在sqlserver和mysql中都可以在定义表的时候,直接给指定自增长。
sqlserver中设置自增长
create table 表名(id int primary key identity(1,1),name varchar(32));
mysql中设置自增长
create table 表名(id int primary key auto_increment,name varchar(32));
----------参考《韩顺平玩转Oracle》