需求
項目於5月份上線支持。但是從3月份開始,公司就開展了實踐,用Excel和文檔來記錄了兩個月的相關數據。而且數據庫的表之間是有關聯關係的,並且是以數據庫表自增的主鍵關聯起來。現在需要把這兩個月的數據導入到生產環境數據庫,生產環境數據庫只能運維的同事維護,不能自己做改動。
具體情況描述(以用戶角色爲例)
- 業務部門給的excel表格如下:
- 數據庫表結構如下
- 要求:
根據excel的信息將用戶信息以及用戶角色信息導入到數據庫中。
解決方案
1、藉助於java代碼和臨時表來實現,適用於大規模多次的導入。
方案流程圖:
- 在開發數據庫中創建一個與Excel表格中字段一直的excel_temp臨時表用來存儲從excel中讀取的數據。因爲excel中的數據會比較雜亂,這一層起到了過濾的作用。不要讀Excel後直接存儲到開發環境的user和user_role表中,這樣不好處理,出了問題難以定位。
- 通過java代碼寫邏輯,將數據從excel_temp表中獲取,然後將數據根據用戶角色規則插入到user和user_role表中。
- 數據已經存儲到兩張表中了。由於user_role和user是用主鍵進行關聯的,那麼如果直接用本來的主鍵,到生產中就很有可能與生產環境中原本數據的主鍵衝突。
- 於是,我們在生產環境中多建了1:1的兩張臨時表user_temp,user_role_temp,這樣以便將我們上述步驟生成的數據輸入到生產環境數據庫中。
- 然後通過java代碼,將數據轉移到user和user_role表中。這樣就不會出現主鍵重複的問題了。
2、方法較爲簡單,適合關聯關係較簡單的數據庫
- 筆者依舊使用了java代碼獲取了excel數據並存儲到excel_temp臨時表中。
- 還是用excel_temp表的數據注入到開發環境數據庫的user表中。
- user表的數據是初始值,所以只要插入user信息後續通過唯一的user_account就可以獲取主鍵user_id。
- 於是就可以導出user數據,手動將主鍵字段去掉,直接可以插入到生產環境中。
- 而通過java代碼查詢excel_temp表就可以批量生成添加數據到user_role的sql語句。
INSERT INTO user_role(user_id,role_id,role_name)VALUES((SELECT user_id FROM user WHERE user_account = '10061***'),1,'管理員');
- 這樣比上一種方法較爲簡單,也符合需求。
其實該項目的表應該直接以user_account這個唯一值來關聯上述的兩張表,這樣的設計才合理。吸取教訓。
劃重點(∩_∩)
本人程序媛一枚,因爲離港澳較近,週末兼職港澳人肉代購。
歡迎各位大佬添加本人微信,還會經常有點贊活動送價值不菲的小禮品哦。
即使現在不需要代購,等以後有了女(男)朋友、有了寶寶就肯定會需要的嘍。
動動手指頭,掃碼一下,就當是對本博文的支持嘛,也是對一個平凡、勤勞、勇敢、秀外慧中等等優點的程序媛莫大的支持哈。