扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
就是因为你重启数据库的原因吧,因为你设置了缓冲,cache size是保存在内存中的,重启之后应该就消失了,不会被保存。
我们提供的服务有:网站制作、成都网站建设、微信公众号开发、网站优化、网站认证、北屯ssl等。为1000+企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的北屯网站制作公司
嗯,楼上的回答也是原因之一,不过楼上的有一种方法避免,就是在确认会正确commit之后,再取seq的值,不过一般没什么意义,seq只是为了自动生成主键或者是给一个数据编成系统唯一标识用的,没啥意义,不用保持连续
你这个其实挺复杂的,要建立一系列的东西来满足你这个需求
给你做个实验吧
先建立一个表
create table test
(id varchar2(20) not null primary key ,
name varchar2(100));
创建一个序列
create sequence seqTest
increment by 1
start with 1
maxvalue 999
nocycle
cache 10;
创建一个存储过程,这个很重要,每天半夜12点执行一次,这个主要是把序列重新置0用的,然后还需要定义一个job来调用这个存储过程
create or replace procedure p_seq
as
n number(10);
v_sql varchar2(100);
begin
select seqTest.nextval into n from dual;
n:=-(n-1);
v_sql:='alter sequence seqTest increment by'|| n;
execute immediate v_sql;
select seqTest.nextval into n from dual;
v_sql:='alter sequence seqTest increment by 1';
execute immediate v_sql;
end;
然后创建一个触发器
create or replace trigger t_test
before insert on test
for each row
begin
select to_char(sysdate,'yyyymmdd')||'_'||lpad(seqTest.nextval,3,0) into :new.id from dual;
end ;
存储过程我没测试,但是编译能过去
现在做个试验
执行这样一个语句
insert into test(name) values ('aa');
然后你检查下数据,然后继续插入再看看
select * from test;
--创建序列的语法 --
CREATE SEQUENCE SEQ_POS_ORDER_ONLINE_ID
INCREMENT BY 1
START WITH 1000000000000042 -- 从1开始计数 或 MINVALUE 1 或 NOMINVALUE --的设置最小值 不设置最小值
NOMAXvalue -- 不设置最大值 或 MAXVALUE 10 --设置最大值 10
NOCYCLE -- 一直累加,不循环 或
CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
如果使用了序列,那么这个跳号的问题只能通过编程来解决,否则是解决不了的。Oracle的序列对象只增加。
可以通过一个触发器来实现序列号字段的处理,一旦插入新数据,就根据扫描的结果,修改序列号字段的值为最大值+1,或者某个值,根据定义的规则确定。
有的财务系统凭证号必须连续,当中间的某一张凭证删除后就有这种需求,要求新产生的凭证号等于删除的那一张。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流