oracle 序列开始为2,oracle序列详解(转)

一、序列介绍

序列: 是oacle提供的用于产生一系列唯一数字的数据库对象。

l 自动提供唯一的数值

l 共享对象

l 主要用于提供主键值

l 将序列值装入内存可以提高访问效率

创建序列:

1、 要有创建序列的权限 create sequence 或 create any

sequence

2、 创建序列的语法

CREATE SEQUENCEsequence //创建序列名称

[INCREMENT BYn] //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1

[START WITHn] //开始的值,递增默认是minvalue 递减是maxvalue

[{MAXVALUEn|NOMAXVALUE}]

//最大值

[{MINVALUEn|NOMINVALUE}]

//最小值

[{CYCLE |NOCYCLE}]

//循环/不循环

[{CACHEn|

NOCACHE}];//分配并存入到内存中

NEXTVAL

返回序列中下一个有效的值,任何用户都可以引用

CURRVAL

中存放序列的当前值

NEXTVAL 应在 CURRVAL

之前指定 ,二者应同时有效

Create sequence seqEmp increment by 1 start with 1 maxvalue

3 minvalue 1

Cycle cache 2;

//先nextval 后 currval

Select seqEmp.nextval  from

dual;

Select seqEmp.currval  from

dual;

Cache

//解释

{

Create 创建

Sequence 序列 seqEmop 序列名称

Increment by 步长

Stat with 1 开始值

Maxvalue 最大值

Minvalue 最小值

Cycle 循环 nocycle 不循环

Cache 缓存 Cache

Nextvalue 下一个

Currval 当前值

}

//实例应用

//实现id的自动递增

//第一步

create table cdpt(

id number(6),

name varchar2(30),

constraint pk_id primary key(id)

);

Create sequence seq_cdpt

Increment by 1

Start with 1

Maxvalue 999999

Minvalue 1

Nocycle

nocache

insert into cdpt

values(seq_cdpt.nextval,’feffefe’);

commit;

select * from cdpt;

/使用序列

会产生裂缝

l 序列在下列情况下出现裂缝:

• 回滚

• 系统异常

>多个表同时使用同一序列

//修改序列的增量, 最大值, 最小值, 循环选项, 或是否装入内存

alter SEQUENCEsequence //创建序列名称

[INCREMENT BYn] //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1

[START WITHn] //开始的值,递增默认是minvalue 递减是maxvalue

[{MAXVALUEn|NOMAXVALUE}]

//最大值

[{MINVALUEn|NOMINVALUE}]

//最小值

[{CYCLE |NOCYCLE}]

//循环/不循环

[{CACHEn|

NOCACHE}];//分配并存入到内存中

修改序列的注意事项:

l 必须是序列的拥有者或对序列有 ALTER

权限

l 只有将来的序列值会被改变

l 改变序列的初始值只能通过删除序列之后重建序列的方法实现

删除序列

l 使用DROP SEQUENCE

语句删除序列

l 删除之后,序列不能再次被引用

Alter sequence seqEmp maxvalue 5;

Select seqEmp.nextval from dual;

二、序列使用

Oracle重置序列(不删除重建方式)

Oracle中一般将自增sequence重置为初始1时,都是删除再重建,这种方式有很多弊端,依赖它的函数和存储过程将失效,需要重新编译。

不过还有种巧妙的方式,不用删除,利用步长参数,先查出sequence的nextval,记住,把递增改为负的这个值(反过来走),然后再改回来。

假设需要修改的序列名:seq_name

1、select

seq_name.nextval from dual; //假设得到结果5656

2、 alter sequence

seq_name increment by -5655; //注意是-(n-1)

3、 select seq_name.nextval from

dual;//再查一遍,走一下,重置为1了

4、 alter sequence seq_name increment by 1;//还原

可以写个存储过程,以下是完整的存储过程,然后调用传参即可:

create or replace

procedure seq_reset(v_seqname varchar2) as n number(10);

tsql varchar2(100);

begin

execute immediate 'select '||v_seqname||'.nextval

from dual' into n;

n:=-(n-1);

tsql:='alter sequence '||v_seqname||' increment

by '|| n;

execute immediate tsql;

execute immediate 'select '||v_seqname||'.nextval

from dual' into n;

tsql:='alter sequence '||v_seqname||' increment

by 1';

execute immediate tsql;

end seq_reset;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值