關於序列同步的問題

dingzihan發表於2014-06-10
     在使用oracle資料庫時,當給一個表設定自增欄位時,我們經常會使用到序列+觸發器來完成。但當你需要對資料庫進行匯入匯出時,序列很容易出問題。
   當你將資料庫匯出後,匯入到另一個資料時,你會發現另一個資料庫裡的序列當前值會小於之前資料庫的當前值,由此會導致你往該表插入資料時,會出現自增欄位的值重複的情況,如果這個自增欄位為主鍵,則你的插入操作就好報錯。
    在網上找了一下資料,發現原來我們對資料庫執行匯出操作時,資料庫先進行的是序列的匯出,然後再進行表資料的匯出,如果在序列匯出過程中,該系統一直在使用,則序列匯出完成後,開始導表資料的時候,有可能表資料因為系統在不斷的使用導致表資料增長,裡面的序列當前值已經增加了很多。當資料庫匯出完成後會造成資料表中的實際記錄跟序列的當前值不一致。
   該問題的解決辦法:在匯入資料庫成功後,重建序列,將序列當前值修改為表記錄自增字的最大值+1,即可。

1、Create Sequence  
你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE許可權,  
CREATE SEQUENCE emp_sequence  
     INCREMENT BY 1   -- 每次加幾個  
     START WITH 1     -- 從1開始計數  
     NOMAXVALUE       -- 不設定最大值  
     NOCYCLE          -- 一直累加,不迴圈  
     CACHE 10;  

2、Alter Sequence  
你或者是該sequence的owner,或者有ALTER ANY SEQUENCE 許可權才能改動sequence. 可以alter除start至以外的所有sequence引數.如果想要改變start值,必須 drop   sequence 再 re-create .  
Alter sequence 的例子  
ALTER SEQUENCE emp_sequence  
     INCREMENT BY 10  
     MAXVALUE 10000  
     CYCLE     -- 到10000後從頭開始  
     NOCACHE ;  

影響Sequence的初始化引數:  
SEQUENCE_CACHE_ENTRIES =設定能同時被cache的sequence數目。   

可以很簡單的Drop Sequence  
DROP SEQUENCE order_seq;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22969361/viewspace-1180052/,如需轉載,請註明出處,否則將追究法律責任。

相關文章