oracle 批量更新之將一個表的數據批量更新至另一個表
CreationTime--2018年7月3日17點38分
Author:Marydon
Oracle 將一個表的指定字段的值更新至另一個表的對應字段
案例一:
1.情景描述
testdata表數據展示
testdata2表數據展示
數據對比:
testdata表有31條數據,且有9條數據的userid與testdata2表不一致(自己獨有);
testdata2表有24條數據,且有2條數據的userid與testdata2表不一致(自己獨有)。
表關聯:testdata表和testdata2表的userid具有關聯關系
需求說明:
需要將testdata中的22條數據更新到testdata2表中
2.錯誤方式
這種方式,由於沒有設置更新的限制條件,導致:
不僅會更新需要更新的表記錄,還會將testdata2中剩余的數據字段更新為空。
3.解決方案
添加where條件,只對兩表共有的數據進行更新。
2018/12/05
正確格式:
UPDATE TABLE1 T1 SET (T1.COLUMN1, T1.COLUMN2) = (SELECT T2.COLUMN1, T2.COLUMN2 FROM TABLE2 T2 WHERE T2.ID = T1.ID) --兩表能夠進行關聯的字段(一般是主鍵) WHERE EXISTS (SELECT 1 FROM TABLE2 T2 WHERE T2.ID = T1.ID);
錯誤格式:
UPDATE TABLE1 T1 SET (T1.COLUMN1, T1.COLUMN2) = (SELECT T2.COLUMN1, T2.COLUMN2 FROM TABLE2 T2 WHERE T2.ID = T1.ID) WHERE EXISTS (SELECT 1 FROM TABLE1 T1 WHERE T1.ID = T2.ID);--exists()訪問不到t2表
說明:雖然理論上,它們執行效果是一樣的,但是由於exists()函數訪問不到t2表,所以查詢訪問不到的那張表t2。
套用
--添加限制條件,進行更新 update testdata2 t2 set (t2.usercode, t2.userpassword) = (select t.usercode, t.userpassword from testdata t where t.userid = t2.userid) where exists (select 1 from testdata t where t.userid = t2.userid);
避免了全表更新。
2018/12/07
案例二:
4.索引的重要性
更新1w條以上的數據時,where后面跟的條件一定要加上索引,不然哭都來不及。
需要更新22w條數據,兩張表的ID_CARD字段沒有建索引
兩張表的ID_CARD字段建立索引后
這是我的親身經歷,沒有建索引前,執行了4個小時,沒有更新完,后來由於電腦關機,導致任務終止;
建索引后,同樣執行該sql,更新22w條數據只用了4秒!!!
說明:對於要執行的更新sql,使用plsql的預測功能時預測不准確,只做參考。
2019/01/10
案例三:
將VIRTUAL_CARD表中的ADDRESS字段數據更新至TEST_CARD表中的ADDRESS字段
方式一:sql實現
UPDATE TEST_CARD T SET T.ADDRESS = (SELECT T2.ADDRESS FROM VIRTUAL_CARD T2 WHERE T.CARDNUM = T2.CARDNUM) WHERE EXISTS (SELECT 1 FROM VIRTUAL_CARD T2 WHERE T2.CARDNUM = T.CARDNUM)
方式二:借助plsql工具
將要更新的表的rowid查詢出來,並獲取最后頁
編輯數據--》選中Address字段所有數據
右鍵--》復制--》選中第一列的Address所有數據--》粘貼
勾選上圖綠色勾,提交即可。
說明:
大批量修改數據時,推薦使用方式一更新;
少量數據修改時,兩種方式均可。
5.總結
A表中有幾個字段的值需要批量更新,如果一個一個進行修改,太慢了:
將批量修改后的內容放到一個新的表中B,並與要更新的表A建立關聯關系。
第一步:建新表
兩表關聯字段(column1):A表中該字段必須具有唯一性;
要更新的字段(column5,cloumn6,...)。
第二步:導數據
將新表字段及每條記錄更新后內容放到excel中,導入oracle數據庫中B表。
第三步:根據兩表關聯關系,將B表數據批量更新到A表中。