关于oracle中的sequence的问题 oracle可以用sequence 实现自增长,但有一个问题当id与一个sequence设定后,insert into 中加入nextvalue可以自增长,但是如果因为某种原因失败 rollback了insert into操作,但是sequence已经加1,就造成了id跳号,有没没办法使当rollback后,sequence的nextvalue不增长!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用异常处理,在执行失败的时候执行rollback同时把序列删掉从建,从你需要的那 个数开始不过建议不要这样,这样就失去了使用序列的意义,搞不好会出现重复的序号 完全没有必要连号啊.sequence的最大值是足够足够足够足够足够足够足够足够你用的. 如果一定需要连号,建议不要用sequence做 你不想跳号,只有用MAX实现,又要考虑并发问题 没办法。你这种要求完全是单机版数据库的设计思路,多用户同时操作数据库你的要求是很难满足的。考虑以下情况:A申请了一个号码nB随后申请了一个号码n+1然后A业务失败,n号码作废然后C再申请号码返回什么?如果象你希望的那样在A失败后把nextvalue置为n的话,那C确实申请到了n,可是后面的人再申请的时候会继续申请到n+1,就出错了。真想不跳号业务又不出错很麻烦的,需要你每次申请号码时检查表中数据,或者你自己管理一个可用号码表会增加很多处理,造成你的程序效率降低,程序复杂之后故障率提高而且就算是这种情况下,仍然会有号码不连续的情况,试想下刚刚举的例子中A业务失败之后没有人继续申请号码的时候,你的数据库里n+1被占用,n没有用上,仍然是不连续的。当然,如果真的有一种病态的心理想让它不跳号,你可以整理下,把n+1全部改成n 如果不想跳号,那就不用序列,而每在新增一条语句时,先select 出这个ID 的max值加上1作为新的ID 看这里http://fronkx.blog.hexun.com/17331585_d.html MAX+1 不可取,B/S模式,多用户申请,有并发问题!! 连号通过SQ无法实现,MAX(KEY)+1,只能先锁记录。 财务中,某些时候的确不能跳号简单的方法用max+1,考虑并发,用select max for update 锁记录复杂的方法,你可以自己考虑一个形如序列的东西,给他一个缓冲,失败的时候回滚。 oracle 数据库视图查询问题? 数据库操作 求一个分段统计语句 字符串比较 oracle有类似于sqlserver的事件探查器的功能或第三方工具也行 这个sql语句怎么写? 有一SQL数据语句,在SQL2000中可以执行,在ORACLE中怎么改啊? 新手求助:设计一个图书管理系统数据库。 奇怪!!!oracle占用了所以的linux系统CUP资源! 这个对insert反映的触发器怎么写?我想在触发器里扑获那条insert语句。那条insert语句含有long行的 在后台处理简单的数字代码识别 求助,求助,如何恢复数据
不过建议不要这样,这样就失去了使用序列的意义,搞不好会出现重复的序号
足够足够足够足够足够足够足够你用的.
你这种要求完全是单机版数据库的设计思路,多用户同时操作数据库你的要求是很难满足的。考虑以下情况:
A申请了一个号码n
B随后申请了一个号码n+1
然后A业务失败,n号码作废
然后C再申请号码返回什么?
如果象你希望的那样在A失败后把nextvalue置为n的话,那C确实申请到了n,
可是后面的人再申请的时候会继续申请到n+1,就出错了。真想不跳号业务又不出错很麻烦的,需要你每次申请号码时检查表中数据,或者你自己管理一个可用号码表
会增加很多处理,造成你的程序效率降低,程序复杂之后故障率提高而且就算是这种情况下,仍然会有号码不连续的情况,试想下刚刚举的例子中A业务失败之后没有人继续申请号码的时候,你的数据库里n+1被占用,n没有用上,仍然是不连续的。
当然,如果真的有一种病态的心理想让它不跳号,你可以整理下,把n+1全部改成n
作为新的ID
简单的方法用max+1,考虑并发,用select max for update 锁记录
复杂的方法,你可以自己考虑一个形如序列的东西,给他一个缓冲,失败的时候回滚。