今天同事提出了一個問題:
使用數(shù)據(jù)泵expdp導(dǎo)出1個schema,有個表主鍵是觸發(fā)器自增的id,導(dǎo)入測試庫測試時,發(fā)現(xiàn)表里的數(shù)據(jù)比自增序列的值要大。導(dǎo)致插入數(shù)據(jù)報錯。
最終結(jié)論是:
由于數(shù)據(jù)庫先進(jìn)行序列導(dǎo)出,然后再進(jìn)行表數(shù)據(jù)導(dǎo)出。然后在導(dǎo)出的過程中,該表一直有插入操作,最終導(dǎo)致了這種差異。
解決方法:
重建觸發(fā)器中的序列,讓序列的開始值為表主鍵最大值+1。
下面我構(gòu)造實驗完整演示下這種場景。
1.準(zhǔn)備測試環(huán)境
需要建立測試表,序列,觸發(fā)器和模擬業(yè)務(wù)插入數(shù)據(jù)的存儲過程。
以下是實際的創(chuàng)建語句:
--在測試用戶jingyu下創(chuàng)建測試表book2drop table book2 purge;create table book2( bookId number(10) primary key, name varchar2(20) ); --創(chuàng)建序列 drop sequence book2_seq; create sequence book2_seq start with 1 increment by 1; --創(chuàng)建觸發(fā)器 create or replace trigger book2_trigger &nb