删除一条自动增长列记录,在下次插入数据时怎么让自动增长接着前面的序号?

时间:2021-07-26 05:56:30
[size=7][size=6]删除一条自动增长列记录,在下次插入数据时怎么让自动增长接着前面的序号?[/size][/size]
例如:有1 2 3 4 5 条记录,删除5后,下次插入时是5而不是6?
来源: http://www.cxy.me/bbs/announce.asp?boardid=26

17 个解决方案

#1


当前序列肯定是生成不了 5 了,除非重新创建序列,然后手工产生到4,然后再去用,其实序列主要用作唯一键,你这样用就失去了序列的意义,而只是每次产生一个连续值而已;

#2


如果删除是4呢?(不是当前最大的行号呢?)是不是4也得补上?

#3


不可能删掉前面的了 后面的每个序列值都要更改 把前面补上? 

然后删除序列 重新建一个seq 起始值为最大值+1?

#4


这个是没办法的,下次取Sequence的值肯定是下一个了。

#5


序列生成后是不可逆转的

#6


没有并发自己写触发器,有并发别想什么连号。

#7


如果说,你每次删除的都是最后一个值,这种情况可以实现,不过麻烦了点,也不是很实用,但能达到那种效果:
select seq_users.currval  from dual;当前序列值:
删除一条自动增长列记录,在下次插入数据时怎么让自动增长接着前面的序号?
修改序列步长为-1:
Alter Sequence seq_users Increment By -1;
select seq_users.nextvalfrom dual;
select seq_users.currval  from dual;
当前的序列值: 删除一条自动增长列记录,在下次插入数据时怎么让自动增长接着前面的序号?
在将序列的增长步长修改会来:
Alter Sequence seq_users Increment By 1;

#8


引用 楼主 YJL5555 的回复:
[size=7][size=6]删除一条自动增长列记录,在下次插入数据时怎么让自动增长接着前面的序号?[/size][/size]
例如:有1 2 3 4 5 条记录,删除5后,下次插入时是5而不是6?
来源: http://www.cxy.me/bbs/announce.asp?boardid=26
这个序列只是一个主键作用,保证数据不重复,连续不连续意义不大吧。

#9


这个序列没办法,只能自己控制。

#10


不要seq,每次自己查询当前最大值?

#11


序列本身是没有意义的,只是一个主键作用。
如果用select max(id) from table 则效率低,而且会有并发问题。

#12


引用 11 楼 DYFDWX 的回复:
序列本身是没有意义的,只是一个主键作用。
如果用select max(id) from table 则效率低,而且会有并发问题。


可以用java内的缓存,每次取出几十个或几百个,
如果用完了就再去取。
这样并发也没问题了。

#13


Sequence没有prevalue一说,序列的值只能增加,不能减小,除非到达最大值且设置了cycle可以回收,序列会从最小值重新开始增加。要实现这个功能只能重新创建序列,或者用sql查出当前值,在插入数据时,加1后作为插入的值,插入数据库

#14


不能自动补 删除一条自动增长列记录,在下次插入数据时怎么让自动增长接着前面的序号?

#15


如果不重新新建序列或修改序列的话是办不到的

#16


序列的值对于机器来说5和6没任何区别,只要是唯一的,所以不可能的。
问题的原因在于你的系统将序列的值用到了业务逻辑上,这点是要不得的

#17


需要自己实现锁机制吧,比较麻烦,建议调整业务逻辑
话说这帖子好老…………

#1


当前序列肯定是生成不了 5 了,除非重新创建序列,然后手工产生到4,然后再去用,其实序列主要用作唯一键,你这样用就失去了序列的意义,而只是每次产生一个连续值而已;

#2


如果删除是4呢?(不是当前最大的行号呢?)是不是4也得补上?

#3


不可能删掉前面的了 后面的每个序列值都要更改 把前面补上? 

然后删除序列 重新建一个seq 起始值为最大值+1?

#4


这个是没办法的,下次取Sequence的值肯定是下一个了。

#5


序列生成后是不可逆转的

#6


没有并发自己写触发器,有并发别想什么连号。

#7


如果说,你每次删除的都是最后一个值,这种情况可以实现,不过麻烦了点,也不是很实用,但能达到那种效果:
select seq_users.currval  from dual;当前序列值:
删除一条自动增长列记录,在下次插入数据时怎么让自动增长接着前面的序号?
修改序列步长为-1:
Alter Sequence seq_users Increment By -1;
select seq_users.nextvalfrom dual;
select seq_users.currval  from dual;
当前的序列值: 删除一条自动增长列记录,在下次插入数据时怎么让自动增长接着前面的序号?
在将序列的增长步长修改会来:
Alter Sequence seq_users Increment By 1;

#8


引用 楼主 YJL5555 的回复:
[size=7][size=6]删除一条自动增长列记录,在下次插入数据时怎么让自动增长接着前面的序号?[/size][/size]
例如:有1 2 3 4 5 条记录,删除5后,下次插入时是5而不是6?
来源: http://www.cxy.me/bbs/announce.asp?boardid=26
这个序列只是一个主键作用,保证数据不重复,连续不连续意义不大吧。

#9


这个序列没办法,只能自己控制。

#10


不要seq,每次自己查询当前最大值?

#11


序列本身是没有意义的,只是一个主键作用。
如果用select max(id) from table 则效率低,而且会有并发问题。

#12


引用 11 楼 DYFDWX 的回复:
序列本身是没有意义的,只是一个主键作用。
如果用select max(id) from table 则效率低,而且会有并发问题。


可以用java内的缓存,每次取出几十个或几百个,
如果用完了就再去取。
这样并发也没问题了。

#13


Sequence没有prevalue一说,序列的值只能增加,不能减小,除非到达最大值且设置了cycle可以回收,序列会从最小值重新开始增加。要实现这个功能只能重新创建序列,或者用sql查出当前值,在插入数据时,加1后作为插入的值,插入数据库

#14


不能自动补 删除一条自动增长列记录,在下次插入数据时怎么让自动增长接着前面的序号?

#15


如果不重新新建序列或修改序列的话是办不到的

#16


序列的值对于机器来说5和6没任何区别,只要是唯一的,所以不可能的。
问题的原因在于你的系统将序列的值用到了业务逻辑上,这点是要不得的

#17


需要自己实现锁机制吧,比较麻烦,建议调整业务逻辑
话说这帖子好老…………