在kettle中使用遍歷來更新記錄中的字段

2021-10-25 08:01:56 字數 1701 閱讀 1526

資料庫中有訂單表tb_order,其中有order_id和user_id和user_name等字段。

資料庫中有使用者資料表tb_user,其中有user_id和user_name等字段。

現在需要使用tb_user.user_name來更新tb_order.user_name,兩個表的關聯條件是tb_order.user_id = tb_user.user_id。

通常,在兩個表都靜止的時候,可以使用乙個update來解決,如下。

update tb_order

set user_name = (select user_name from tb_user u where u.user_id = tb_order.user_id);

但是,如果這兩個表的資料量較大,且兩個表都在生產頻繁使用的時候,乙個update語句會鎖表,且需要較長的時間,從而可能會導致正常的業務無法快速進行。

此時,就應該單獨遍歷tb_order表中的每一條記錄,然後根據tb_order.user_id去tb_user中查詢每一條記錄中的user_name,最後根據tb_order.order_id來更新tb_order.user_name;這個單獨遍歷的方式,雖然不能完全解決鎖表引起的問題,但是也可以較大概率避免。

一下是乙個用遍歷記錄的思路處理問題的kettle配置,這個配置模式,效率非常低。

思路如下:

1:將tb_order表中資料讀入記憶體

2:從記憶體中獲得乙個記錄中的字段值,並將這些值設定成kettle的變數

3:使用這些kettle變數來作為引數去tb_user中查詢出來user_name,並將結果寫入kettle變數

4:使用kettle中的變數,來對tb_order進行update操作

頂層配置是乙個job,裡面包含乙個轉換和乙個job,轉換實現了第1步的功能,job包含3個轉換,分別實現了第2、3、4步的功能。具體配置如下:

頂層配置,比較關鍵的部分就是,job的屬性設定是,一定要選中"執行每乙個輸入行":

轉換從tb_order獲得資料的配置。表輸入中使用的sql為:select order_id,user_id from tb_order

job通過user_id得到user_name的配置如下

設定變數就是思路中的第2步,將記憶體中的一條記錄寫入kettle中的變數,注意,欄位名需要和頂層的轉換中對應的查詢的名字一致,字段型別需要和實際的資料庫表的字段型別一致。設定變數的配置如下,我是通過獲取欄位的方式來讓其自動設定變數的。

轉換修改tb_order中的user_name的配置就是思路中的第4步,是乙個sql指令碼。配置資訊如下:

在中使用SQLDMO

曾幾何時,夥伴們為的公升級傷透了腦筋.往往程式的公升級趕不上資料庫的公升級 版本控制的好,這也許不是什麼問題,但對於很大一部分中國公司來說這是無法避免的 而有些n久以前的資料庫要使用新程式的時候,資料庫的公升級簡直就是無從下手.所以對比資料庫公升級的緊要性就逐漸的凸現出來.對於表和字段的公升級按道理...

Python中使用遍歷在列表中新增字典遇到的坑

已知列表li 定義乙個函式,將該列表按照其元素的value 值進行排序,並輸出結果 思路很清晰,新建乙個列表,然後遍歷取出字典的值加入到新的列表中,再通過遍歷,賦值字典,使用append方法依次新增到列表,這樣就是乙個按照value值排續.於是有了下面的 li def fun li li 1 接收v...

kettle在多環境中區分環境使用

kettle的kettle.properties可以根據環境新增值,job中使用變數,達到區分環境的效果。通常我們專案中每個環境的資料庫都是分開的,這個時候我們就需要根據環境來設定資料庫的連線資訊了,如 編輯kettle.properties 資料庫連線使用變數 這樣就能達到區分環境的效果。自定義修...