今天同事提出了一個(gè)問題:
使用數(shù)據(jù)泵expdp導(dǎo)出1個(gè)schema,有個(gè)表主鍵是觸發(fā)器自增的id,導(dǎo)入測(cè)試庫測(cè)試時(shí),發(fā)現(xiàn)表里的數(shù)據(jù)比自增序列的值要大。導(dǎo)致插入數(shù)據(jù)報(bào)錯(cuò)。
最終結(jié)論是:
由于數(shù)據(jù)庫先進(jìn)行序列導(dǎo)出,然后再進(jìn)行表數(shù)據(jù)導(dǎo)出。然后在導(dǎo)出的過程中,該表一直有插入操作,最終導(dǎo)致了這種差異。
解決方法:
重建觸發(fā)器中的序列,讓序列的開始值為表主鍵最大值+1。
下面我構(gòu)造實(shí)驗(yàn)完整演示下這種場(chǎng)景。
1.準(zhǔn)備測(cè)試環(huán)境
需要建立測(cè)試表,序列,觸發(fā)器和模擬業(yè)務(wù)插入數(shù)據(jù)的存儲(chǔ)過程。
以下是實(shí)際的創(chuàng)建語句:
--在測(cè)試用戶jingyu下創(chuàng)建測(cè)試表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