就是因為你重啟數據庫的原因吧,因為你設置了緩沖,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,或者某個值,根據定義的規則確定。
有的財務系統憑證號必須連續,當中間的某一張憑證刪除后就有這種需求,要求新產生的憑證號等于刪除的那一張。
網頁名稱:oracle序列怎么連續 oracle序列循環
網址分享:http://m.kartarina.com/article46/hgsshg.html
成都網站建設公司_創新互聯,為您提供云服務器、品牌網站制作、ChatGPT、微信小程序、App開發、網站維護
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯