由於LZ很像整理一下如何使用Kettle對一張表進行增量更新的時候,
同時實現對數據庫中的其他表也可以實現相關的更新操作。
第一種方法想使用觸發器,即在相應的hop之間添加SQL腳本step然後在step中實現對其他數據表進行比照更新的相關操作。
另一種方法是,時間戳,可以添加時間點,然後通過判斷時間點是否變更來判斷數據進行了相關的變動。
其實還有一種方法就是分析日誌,這個對我來說暫時還是有些難度了,數據庫針對性也很強,所以先自動過濾掉吧~
但是想到,
如果在kettle 中不對其進行額外設定step的操作,在更新一張表的時候
與之相關的表中對應的字段是否會根據該字段中的:變更而自動更新,刪除而自動變爲空等等一些操作。
先說一下結果吧:在kettle中 如果兩張表僅僅靠foreign key constraint 這種約束的話,
其中主表的外鍵是附表的主鍵(也就是主表對應該字段的數值是附表對應該字段數值集合的子集),
如果在附表中進行數據更新,
則在主表中的字段不會隨之更新,而是會報錯的。
所以,接下來只能是自己寫觸發器了,來實現同步多個相連的表的同步更新了。
下面是LZ所創建的實驗表和相關的數據:
首先,在mysql數據庫中創建相應的數據庫作爲帶被更新的舊數據源:
create database test7_26;
use test7_26;
create table class
(
classId int not null,
className varchar(50) not null,
primary key(classId)
);
create table stu
(
id int not null,
name varchar(50) not null,
primary key (id),
classId int not null,
key classId (classId),
constraint id_to_class foreign key(classId)
references class(classId)
);
insert into class values(2310,'chinese'),(2308,'physical'),(2511,'eng'),(2191,'PE'),(2383,'chemical'),(2276,'music'),
(1961,'photoshop'),(2792,'flash'),(1632,'computer'),(3216,'history');
insert into stu values(100,'inuyasha', 2310),(102, 'kokia',2308),(209,'kagome',2511),(90,'natsume',2191),(98,'kikiyou',2383),(133,'tegomass',2276);
由於兩張表之間存在約束,所以應該首先創建附表class。
並且在插入數據的時候也應該先向附表中插入數據。
然後在創建一個數據庫,作爲新數據源,
在其中爲了方便僅僅創建一個class表,
(因爲在新數據源中創建stu表在本實驗中根本沒有用途,所以不創建)
在class表中進行相關數據的變更。
然後使用kettle同步兩個數據源中的兩張class表,
看舊數據源中的stu對應字段是否會相應的進行變動。
下面是新數據源的創建語句:
create test7_26_new;
use test7_26_new;
create table class
(
classId int not null,
className varchar(50) not null,
primary key(classId)
);
insert class values(12402,'new class'),
(2191,'PE'),(2383,'chemical'),(2276,'economic_changed'),
(1961,'photoshop_changed'),(2792,'flash'),(1632,'computer'),
(3216,'history'),(480604, 'operating system_new');
//(12402,'new class'),(480604, 'operating system_new')=>對應的是new
//(1961,'photoshop_changed'),(2276,'economic_changed')=>對應的是changed
//(2310,'chinese'),(2308,'physical'),(2511,'eng');=>對應的是deleted
//其餘對應的是identical
其中new,changed,deleted的對應記錄在舊數據源同步之後並不會對舊數據源中的stu表進行相應的更改,
這也不是本實驗的重點。
本實驗的重點事項測試deleted舊數據源的class表中相關字段之後,
與之相關的(100,'inuyasha', 2310),(102, 'kokia',2308),(209,'kagome',2511),
這三條舊數據源中stu表中的三條記錄的classId這一字段將會如何變更,
是否會進行相關的級聯自動更新變更操作。
根據前一篇的具體介紹,首先在Kettle中新建一個轉換:
整體流程截圖:
接下來創建兩個數據庫連接,
分別對應mysql數據庫的test7_26;test7_26_new;
(圖)
接下來拖拽兩個表輸入,
分別對應test7_26.class和test7_26_new.class
test7_26_new.class:
(我用畫圖工具鉛筆寫的,比用腳寫的還難看,哈哈哈哈,
cg對應的是這些字段是會出現changed的,在合併記錄之後)
接下來將二者記性排序處理
(僅對classId進行排序就可以,
因爲排序是爲了提高合併記錄的效率,
而後面的合併記錄僅僅是針對classId
進行新舊數據源的比對,
所以只對classId進行相應的比對就可以的)
,然後進行合併記錄,然後查看一下結果;
結果與設想的一致。
然後進行增加數據同步step操作。
下面是對step進行相應的字段設定
如果不考慮錯誤的話,可以在相應的同步數據的後面加上一個日誌處理step,
可以強制執行對舊數據源的數據表class進行更新,
由於有級聯對class和stu相連接,所以可以對class中的相應字段進行插入更新,
而對應的deleted字段並不會相應的執行從舊數據源的class中delete相應記錄的操作。
所以,stu中對應字段不進行改變:
下圖分別是整體流程的設計和執行後使用mysql控制檯顯示數據庫test7_26;舊數據源中,
數據表stu對應字段的更新的情況:
如果沒有外鍵約束對應的三條畫紅勾的對應的三條記錄應該被從舊數據源
table:class中被移除。
這一點與設想的不一致。
但是合併記錄對應爲new的三條記錄:
new class
oper system new卻被成功的同步進去了。
這一點與設想的一致。
本BOLG由奇米影視站長轉自博客園。