在使用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 這裡主要是解決資料庫的字符集問題,根據資料庫的字符集設定,保...