在Oracle开发中,序列常为数据表提供自增列值。
主流数据库的自动生成序号策略
sql server
sqlserver中,提供了identity类型–表示自增类型。
create table test(
id int identity(1,1),
name varchar(20)
)
其中identity(1,1)代表,将该列的值,从1开始,每增加一条记录,列值将自动加1
MySQL
在MySQL中,自增列的设置使用auto_increment关键字
create table order(
id int primary key not null auto_increment,
content varchar(20),
customer_id int
);
在sqlserver和MySQL插入数据时,将主键列留空,那么数据库将自动为主键列赋值。
Oracle
Oracle并未提供对列的属性进行设置,从而实现自增功能,而是通过序列实现。通过序列实现时,用户必须将获得的值显式赋予主键列
create table test(
id integer primary key,
name varchar(20)
);
insert into test(sequence_name.nextval,'张三');
sequence_name.nextval是利用序列来为主键列赋值
创建和使用序列
序列和表、约束、视图、触发器等一样,是Oracle对象之一。一旦创建,即可保存于数据库中,并在合适场合进行调用。
创建序列
create sequence 序列名称
create sequence为固定命令;序列名称一般要与所服务对象具有一定的关联性,并添加seq后缀。
create sequence employee_seq
使用序列
序列的2个重要属性–currval和nextval。
currval:获得序列的当前值
nextval:获得序列的下一个值;默认情况下为当前值+1
获得currval属性和nextval属性的调用形式为
序列名称.currval
序列名称.nextval
在序列创建后,应该先使用seq.nextval,然后才能使用seq.currval。否则报错
如果表中已经存在了6条记录,不能直接使用employee_seq的nextval获取主键值,而是多次调用使其增长到6,在调用。增长的方式:
select employee_seq.nextval from dual;
指定序列初始值
使用start with指定序列初始值,n代表初始值
create sequence 序列名称 start with n
序列属性
主要属性包括minvalue,maxvalue,increment_by,cache和cycle。在序列创建时,如果未指定这些属性的值,Oracle会为其赋予默认值。可以通过alter修改这些属性。
设置序列最大、最小值-minvalue和maxvalue属性
序列的最小值默认为1,最大值默认为1E27即10的27次方
修改序列最小值
alter sequence 序列名称 minvalue 最小值
minvalue用于重置序列的最小值,一个序列的最小值不能大于当前值,否则报错
修改序列最大值
alter sequence 序列名称 maxvalue 最大值
将序列最大值设置为无限大
alter sequence employee_seq nomaxvalue
设置序列的增长步长–increment_by属性
alter sequence 序列名称 increment by 步长
设置序列循环取值–cycle属性
cycle用于指定序列的nextval取值超出最大值时,从序列的minvalue属性指定的值继续获取,并且可以周而复始,获取无穷多次。
将序列修改为可循环
alter sequence test_seq cycle
关闭循环取值
alter sequence test_seq nocycle
设置序列缓存大小–cache属性
cache是序列缓存。缓存的意义在于,Oracle一次性获取序列中的多个连续值,并置于内存中。当使用nextval取值时,可以从缓存中直接获取,提高效率。
序列缓存默认大小为20,可用过alter修改
alter sequence 序列名称 cache 缓存的新大小
序列缓存的大小必须小于一次循环所获得的数目,比如步长为2.最大值30,缓存是20的话,就会报错。因为一次循环能拿到15个值,小于缓存20,所以报错
注意:不能将缓存设置过大,否则可能影响其他属性的设置
屏蔽序列缓存
alter sequence test_seq nocache
本文来自博客园,作者:NE_STOP,转载请注明原文链接:https://www.cnblogs.com/alineverstop/p/18004639