由於LZ很像整理一下如何使用Kettle對一張表進行增量更新的時候,
同時實現對數據庫中的其他表也可以實現相關的更新操作。
第一種方法想使用觸發器,即在相應的hop之間添加SQL腳本step然後在step中實現對其他數據表進行比照更新的相關操作。
另一種方法是,時間戳,可以添加時間點,然後通過判斷時間點是否變更來判斷數據進行了相關的變動。
其實還有一種方法就是分析日志,這個對我來說暫時還是有些難度了,數據庫針對性也很強,所以先自動過濾掉吧~
但是想到,
如果在kettle 中不對其進行額外設定step的操作,在更新一張表的時候
與之相關的表中對應的字段是否會根據該字段中的:變更而自動更新,刪除而自動變為空等等一些操作。
先說一下結果吧:在kettle中 如果兩張表僅僅靠foreign key constraint 這種約束的話,
其中主表的外鍵是附表的主鍵(也就是主表對應該字段的數值是附表對應該字段數值集合的子集),
如果在附表中進行數據更新,
則在主表中的字段不會隨之更新,而是會報錯的。
所以,接下來只能是自己寫觸發器了,來實現同步多個相連的表的同步更新了。
下面是LZ所創建的實驗表和相關的數據:
首先,在mysql數據庫中創建相應的數據庫作為帶被更新的舊數據源:
()
(
id name () classId id_to_class );
由於兩張表之間存在約束,所以應該首先創建附表class。
並且在插入數據的時候也應該先向附表中插入數據。
然後在創建一個數據庫,作為新數據源,
在其中為了方便僅僅創建一個class表,
(因為在新數據源中創建stu表在本實驗中根本沒有用途,所以不創建)
在class表中進行相關數據的變更。
然後使用kettle同步兩個數據源中的兩張class表,
看舊數據源中的stu對應字段是否會相應的進行變動。
下面是新數據源的創建語句:
() class (,,),(,),(,),
(,),(,),(,),
(,),(, );
,'new class'),(, 'operating system_new')=>對應的是new
//(,'photoshop_changed'),(,'economic_changed')=>對應的是changed
//(2310,'chinese'),(2308,'physical'),(2511,'eng');=>對應的是deleted
//其余對應的是identical
如果沒有外鍵約束對應的三條畫紅勾的對應的三條記錄應該被從舊數據源
table:class中被移除。
這一點與設想的不一致。
但是合並記錄對應為new的三條記錄:
new class
oper system new卻被成功的同步進去了。
這一點與設想的一致。
接下來還是,乖乖的使用快照方式以及觸發器來實現同步數據吧~
雖說這次試驗思路真的是挺簡單的,
但是操作起來還是不順手,有很多方法思想也不主流。
希望以後對這門技術更加的精通,呵呵。
還有很多東西要學習呢,加油吧~