需求:檔案批量匯入,若有主鍵重復的原始記錄則洗掉,重新匯入。
做法:
1.讀取檔案的一條記錄后,先select庫中是否有,有就delete,然后insert;效率太低,檔案資料大。
2.直接insert,報主鍵重復才delete,然后再insert;請問這么做有什么問題?
還有最恰當的優化是什么樣的?
uj5u.com熱心網友回復:
需求:檔案批量匯入,若有主鍵重復的原始記錄則洗掉,重新匯入。從檔案匯入這樣的操作,你要先把檔案中的所有記錄先匯入到一張臨時表。導用完成后,用資料庫的統一去合并,最后清空臨時表;
合并時使用 merge 陳述句,樓主先百度一下,有問題再來追問;
uj5u.com熱心網友回復:
先匯入一張臨時表,再用merge陳述句來插入表uj5u.com熱心網友回復:
那目前我的主鍵重復后再洗掉和插入的做法,有什么不好的影響?因為版本已經UAT了,如果影響不大我就不會回退版本,等下次發布時再修改。
uj5u.com熱心網友回復:
每條記錄判斷一次,太耗時間了。如果用臨時表,一次性合并過去,效率要高好多,90%以上。
uj5u.com熱心網友回復:
用C語言寫,嵌入式SQL也可以創建臨時表嗎?以前就用過增刪改差
uj5u.com熱心網友回復:
merge into tableA using (select * from dual) as tableB on (tableA.id=tableB.id)when matched then update set ...
when not matched then insert value()
uj5u.com熱心網友回復:
理論上最科學的做法是:1,先把所有資料匯入到自己建的一張臨時表中
2,然后執行一個比對的存盤程序
具體邏輯是:主鍵相同的資料記錄在一張單獨的例外資料表中,沒有相同的則直接插入,最后插入匯入日志表。前臺查看是否存在例外資料并修改后重新匯入。
uj5u.com熱心網友回復:
可以試試: mergeuj5u.com熱心網友回復:
你試試我這條陳述句DECLARE
CURSOR csr_data IS
SELECT *
FROM A;
BEGIN
FOR a IN csr_data
LOOP
UPDATE B b
SET
b.列名= a.列名 //這里是需要更新的欄位
WHERE
b.列名=a.列名 //判斷條件
;
END LOOP;
END;
uj5u.com熱心網友回復:
1, 使用外部表讀取檔案2, 樓主實際要做的操作是UPDATE,所以merge最合適
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/102106.html
標籤:開發
上一篇:Oracle查詢陳述句報錯
下一篇:oracle 存盤程序中引數問題
