日期:2014-05-19  浏览次数:20834 次

Oracle序列自动增长问题
create table book( 
id number primary key not null,
username varchar2(50), 
password varchar2(20)
)
--------------序列增长问题
CREATE SEQUENCE my_book_seq                         
INCREMENT BY 1                                        ----步进为1
START WITH 1                      ----从1开始递增,可以是其他数字

----触发器
CREATE TRIGGER my_book_trigger BEFORE INSERT ON book FOR EACH ROW
BEGIN SELECT my_book_seq.NEXTVAL INTO :NEW.id FROM DUAL;
END;


这是我写的自动增长序列。可是问题就来了:
第一:假如我插如了一条数据  ID是1,当我dalete 掉数据后重新插入id还是会自动增长,变 
      成了2 。。为什么?要怎么改?
第二:我用SSH新增数据的时候,他是偶数的加。什么意思我先讲清楚:当我新增一条数据,查询出来的id是78,我再新增一条数据居然不是79,而是80。为什么啊?


请能根据我这个表改进的序列增长源代码:

------最佳解决方案--------------------
Sequence是不会回滚(减少)的,如果会减少那并发或集群环境下就乱套大了。

至于为什么增长是2,这个则不一定,为了提升性能,Sequence的增长会有些缓存等的处理;你可以在一个事务中连续插入两条记录来看看是否连续。
------其他解决方案--------------------

第一:假如我插如了一条数据  ID是1,当我dalete 掉数据后重新插入id还是会自动增长,变 
      成了2 。。为什么?要怎么改?
--- 这个是一定的,没法改,如ldh911所说,改了会乱大局,所以不推荐你这么做。但是方法是有的,就是用INCREMENT BY -1。但这个基本是用于降序sequence时的,不是用来修改primary key的。

第二:我用SSH新增数据的时候,他是偶数的加。什么意思我先讲清楚:当我新增一条数据,查询出来的id是78,我再新增一条数据居然不是79,而是80。为什么啊?
--- 如果lz设定的是increment by 1而结果是by 2则这显然是不正确的。但看来你的代码没有什么问题所以很大可能造成这样的结果的原因是......你有两个trigger在做同样的事情--增加sequence. 查一查你这个数据库的信息吧. 不敢完全确定,但貌似是这样的


------其他解决方案--------------------
是不是你79的时候出错了 然后序列也增加了一个  所以就80 了