1.需求
將百萬級以上的數據從A表遷移到B表里面,B表本來就存在的記錄,就做更新操作,B表之前不存在的記錄,就做插入操作
2.分析
首先,一般來說,有些人會在java代碼里面實現,先將需要更新和插入的數據分別查詢出來,再使用oracle的batchUpdate這個方法,一般來說,這個效率也是不錯的,但是,由於oracle數據庫的batchUpdate這個批量執行的方法是不會返回執行成功的條數的,由於無法知道執行的結果,風險不可預估,一般不會采取這種方法!如果要一條一條去執行,效率實在是太低.
既然batchUpdate行不通,那么有什么好辦法呢?經過本人的一番百度,終於找到了一個方法,那就是使用merge into,直接在數據庫解決問題.這種方法非常高效,而且執行過程中如果遇到失敗,執行會終止,且會拋出錯誤.換句話說,不報錯,即表示全部執行成功,提交事務即可生效.
3.實現
假如有A表,A表有FA1,FA2,FA3,FA4.....n個字段,F1為主鍵,有B表,B表有FB1,FB2,FB3,FB4...n個字段,FB1為主鍵,需要將A表的數據遷移到B表中
直接可以這么寫
MERGE INTO B T1
USING (SELECT * FROM A ) T2 ON (T1.FB1 = T2.FA1 )
WHEN MATCHED THEN
UPDATE B SET T1.FB2= T2.FA2,T1.FB3= T2.FA3,T1.FB4=T2.FA4
WHEN NOT MATCHED THEN
INSERT(T1.FB1,T1.FB2,T1.FB3,T1.FB4) VALUES(T2.FA1,T2.FA2,T2.FA3,T2.FA4);
4.注意
1.更新時,主鍵不能更新
2.using 里面的那個查詢語句是可以根據你的業務需求,添加where條件的,on里面的連接條件也是可以多個的,當主鍵是聯合主鍵的時候,on里面可以寫多個,用and連接