?由來:需要將一個系統的數據(MySQL)抽取到另一個系統(Oracle),使用ETL方式。隨着數據量的增加,全量同步數據不可行,所以得做增量更新。業務數據表有主鍵,除了新增外,以前同步的數據非主鍵信息可能會發生更改。
1.看了下網上的思路,有一種是這樣的(A代表表名):一句話概括-通過主鍵對比找到新增行-同步數據。
①select max(id) from mysql.A;===>>>找出MySQL中的最大ID;
②select * from oralce.A where a.id > ?;===>>>?代表①的max(id),找出oracle中比MySQL.max(id)大的ID;
③insert into mysql.A value = ②;===>>>將②中數據插入mysql;
第一步沒什么滑頭,第二步如下:
第三步如下:
*上述方法沒有問題,但是在初始化的時候行不通,原因是步驟①-mysql.A中沒數據時,即max(id)=null,導致帶入第 ②步的and條件的id > null ,即varchar > null,數據不會寫到MySQL,當MySQL中有一條符合條件的ID時,是可行的。
2.在轉換中新增的“插入/更新”時其實已經包含了兩個動作-插入和更新,所以可以去掉1中的比較結果集步驟:
①找出oracle.A中的所有符合條件的數據;
②將上一步找到的數據通過ID字段和MySQL中的對比,做出更新動作;
*這里的更新包含2層含義:
*更新:如果ID = ID,ID字段不更新,其他字段更新,即ID更新=N,其他字段更新=Y;
*新增:如果ID != ID,在以上范圍外,新增;
*可以先同步三條數據到mysql.A;然后再在oracle.A中增加一條數據,修改一條數據的非ID字段,執行下看下效果。
3.補充說明:若刪除了oracle.A中已同步到mysql.A的數據時,執行操作后不會影響mysql.A中的這條數據。