做IT运维的啥都要会点,比如DBA,开始可以不懂数据库,但要会查资料,查了就是学了,做了就是会了。
有一张Oracle表用到序列(Sequence)作表ID,出现的问题是,测试时出现数据保存不进去,排查发现是序列的问题。因为这是个测试库,经常删除旧表,往里导新数据,但是序列没有随之更新,仍按自己的节奏固定增加,现在表中数据的ID最大值其实已经大于这个序列的当前值,当新数据取得的新序列与表中已有数据的旧ID相同,就出现错误而不能插入。
解决方法就是要把这个序列的当前值改大,大于表ID的最大值,但是正在使用的序列无法直接修改初始值(start with),想用“alter sequence 序列名 start with 新值”是不行的,除非删除整个序列重新建,这也不是不行,就是如果该数据库正在使用,可能会受影响,幸好我这只是个测试库,可以随便整。不过我们还有不删除的方法,就是改增加值(Increment by)。
增加的数值在使用中的序列是可以修改的,先查询该序列当前值是多少,nextval或currval,后者需要先运行一下前者的查询才能查到,但前者每运行一次,数值就按增加值加上去,反正要修改也无所谓,然后计算一下从当前值要增加多少才能大于现在表里的最大ID,把这个数改进增加值里:
ALTER SEQUENCE 序列名 INCREMENT BY 修改的增加值
改完再运行一遍nextval的查询:
select 序列名.nextval from dual
当前值自动加上增加值,达到目的后再改回原来的增加值,比如1:
ALTER SEQUENCE 序列名 INCREMENT BY 1。
完成。
女厕所的抽水马桶不通,领导让我去看看……
>> 除非说明均为原创,如转载请注明来源于http://www.stormcn.cn/post/2349.html