oracle 資料匯出匯入序列不一致問題

2021-07-03 01:05:58 字數 1761 閱讀 2046

在使用oracle

資料庫時,當給乙個表設定自增字段時,我們經常會使用到序列

+觸發器來完成。但當你需要對資料庫進行匯入匯出時,序列很容易出問題。

當你將資料庫匯出後,匯入到另乙個資料時,你會發現另乙個資料庫裡的序列當前值會小於之前資料庫的當前值,由此會導致你往該錶插入資料時,會出現自增字

段的值重複的情況,如果這個自增字段為主鍵,則你的插入操作就會報錯。

在網上找了一下資料,發現原來我們對資料庫執行匯出操作時,資料庫先進行的是序列的匯出,然後再進行表資料的匯出,如果在序列匯出的過程中,該系統一直在使用,則序列匯出

完成後,開始導表資料的時候,有可能表資料因為系統在不斷的使用導致表資料增長,裡面的序列當前值已經增加了很多。當資料庫匯出完成後,會造成資料表中的實際記錄跟序列的當前值不一致。

該問題的解決方法:在匯入資料庫成功後,重建序列,將序列當前值修改為表記錄自增字的最大值+1

,即可。如下2:

oracle中一般將自增

sequence

重置為初始

1時,都是刪除再重建,這種方式有很多弊端,依賴它的函式和儲存過程將失效,需要重新編譯。

不過還有種巧妙的方式,不用刪除,利用步長引數,先查出sequence

的nextval

,記住,把遞增改為負的這個值(反過來走),然後再改回來。

假設需要修改的序列名:

seq_name 1、

select seq_name.nextval from dual; //

假設得到結果

5656

2、 alter sequence seq_name increment by -5655; //

注意是-(n-1) 3、

select seq_name.nextval from dual;//

再查一遍,走一下

,重置為1了

4、alter sequence seq_name increment by 1;//還原

可以寫個儲存過程,以下是完整的儲存過程,

然後呼叫傳參即可: 

create

orreplace

procedure seq_reset(v_seqname varchar2) as n number(10);

tsql varchar2(100);

begin

execute immediate 'select '

||v_seqname||

'.nextval from dual'

into n;

n:=-(n-

1);tsql:=

'alter sequence '

||v_seqname||

' increment by '

|| n;

execute immediate tsql;

execute immediate 'select '

||v_seqname||

'.nextval from dual'

into n;

tsql:=

'alter sequence '

||v_seqname||

' increment by 1';

execute immediate tsql;

end seq_reset;

3. 檢視資料列表的序列的最大值

select max(to_number(a.zj))  from cjgl_djksmdb a

oracle資料匯入匯出

語法 imp userid password 資料庫全域性名 file dmp檔案的目錄 其它引數 獲取幫助,敲入 imp help y import常用的引數 1 file 指定匯入檔名 fromuser 允許匯入指定的使用者擁有的表 full full y時,匯入dmp檔案中所有的事物 igno...

Oracle資料匯入匯出

資料庫的維護過程,難免遇到一些表的備份和恢復工作。為了方便起見,我將這些重複的工作整理成了執行在windows上的批處理,和執行在aix伺服器上的kshell指令碼。指令碼的作業內容就是,指定具體的表集合,分檔案逐表備份和恢復。如果是經常性的指定的固定表的話,可以修改以陣列方式的指令碼。如果是經常改...

oracle 資料匯出匯入

資料庫的匯出匯入 匯出表步驟 1 匯出表結構與資料 2 匯出序列 3 匯出觸發器 4 匯出檢視 匯出表工具 plsql developer 設定環境變數 變數名 nls lang 變數值 american america.zhs16gbk 這裡主要是解決資料庫的字符集問題,根據資料庫的字符集設定,保...