在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
posted on 2018-10-11 16:40  NE_STOP  阅读(5)  评论(0编辑  收藏  举报  来源