例如:有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?
然后删除序列 重新建一个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;
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
这个序列只是一个主键作用,保证数据不重复,连续不连续意义不大吧。
#9
这个序列没办法,只能自己控制。
#10
不要seq,每次自己查询当前最大值?
#11
序列本身是没有意义的,只是一个主键作用。
如果用select max(id) from table 则效率低,而且会有并发问题。
如果用select max(id) from table 则效率低,而且会有并发问题。
#12
可以用java内的缓存,每次取出几十个或几百个,
如果用完了就再去取。
这样并发也没问题了。
#13
Sequence没有prevalue一说,序列的值只能增加,不能减小,除非到达最大值且设置了cycle可以回收,序列会从最小值重新开始增加。要实现这个功能只能重新创建序列,或者用sql查出当前值,在插入数据时,加1后作为插入的值,插入数据库
#14
不能自动补
#15
如果不重新新建序列或修改序列的话是办不到的
#16
序列的值对于机器来说5和6没任何区别,只要是唯一的,所以不可能的。
问题的原因在于你的系统将序列的值用到了业务逻辑上,这点是要不得的
问题的原因在于你的系统将序列的值用到了业务逻辑上,这点是要不得的
#17
需要自己实现锁机制吧,比较麻烦,建议调整业务逻辑
话说这帖子好老…………
话说这帖子好老…………
#1
当前序列肯定是生成不了 5 了,除非重新创建序列,然后手工产生到4,然后再去用,其实序列主要用作唯一键,你这样用就失去了序列的意义,而只是每次产生一个连续值而已;
#2
如果删除是4呢?(不是当前最大的行号呢?)是不是4也得补上?
#3
不可能删掉前面的了 后面的每个序列值都要更改 把前面补上?
然后删除序列 重新建一个seq 起始值为最大值+1?
然后删除序列 重新建一个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;
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
这个序列只是一个主键作用,保证数据不重复,连续不连续意义不大吧。
#9
这个序列没办法,只能自己控制。
#10
不要seq,每次自己查询当前最大值?
#11
序列本身是没有意义的,只是一个主键作用。
如果用select max(id) from table 则效率低,而且会有并发问题。
如果用select max(id) from table 则效率低,而且会有并发问题。
#12
可以用java内的缓存,每次取出几十个或几百个,
如果用完了就再去取。
这样并发也没问题了。
#13
Sequence没有prevalue一说,序列的值只能增加,不能减小,除非到达最大值且设置了cycle可以回收,序列会从最小值重新开始增加。要实现这个功能只能重新创建序列,或者用sql查出当前值,在插入数据时,加1后作为插入的值,插入数据库
#14
不能自动补
#15
如果不重新新建序列或修改序列的话是办不到的
#16
序列的值对于机器来说5和6没任何区别,只要是唯一的,所以不可能的。
问题的原因在于你的系统将序列的值用到了业务逻辑上,这点是要不得的
问题的原因在于你的系统将序列的值用到了业务逻辑上,这点是要不得的
#17
需要自己实现锁机制吧,比较麻烦,建议调整业务逻辑
话说这帖子好老…………
话说这帖子好老…………