我在oracle数据库中,建了一个表,其中一个字段是用sequence的自增序列插入的,
但问题是当插入失败时,sequence的值依然会加1,所以得到的数据的最后结果会出现
该字段的值在某些地方不连续,请问如何实现在插入失败时,序列的值不增加,而在插入
成功时加1,该字段要得到连续的值,中间不能有空缺啊!!!
盼回复,不胜感激!!!
但问题是当插入失败时,sequence的值依然会加1,所以得到的数据的最后结果会出现
该字段的值在某些地方不连续,请问如何实现在插入失败时,序列的值不增加,而在插入
成功时加1,该字段要得到连续的值,中间不能有空缺啊!!!
盼回复,不胜感激!!!
但是你为什么要得到连续的值呢?用序列目的是让该字段数据唯一吧?
要是你一定要得到连续的值,你可以另外加个字段(如:rn number(10)),在每次插入数据后
update your_table_name set rn=rownum
每次新增的ID为
declare newID number
select max(id)+1 into newID from tb;
方法二:循环nextval
方法三:序列从i改为j,设置增量为j-i,执行nextval,改回增量
这样能保证ID连续,并且并发不会有问题
但牺牲了性能
如果你操作的用户多,那大家都会抓狂
实际上用序列是很少的方式,连续编号有那么重要吗?
其实序列无非也就是生成唯一的值,而不一定强调连续;
如果需要连续 可以考虑游标,设置一个i值,每次提交都自己加一
例如
for i in 1..999999 loop
insert into table_a
select i,xx from table_b
commit;
end loop;
如果下次执行前先把 max 找出来,然后继续 从该值开始i+1