Import

在 CSV 文件中應用於多個數據庫

  • March 7, 2013

最近,我一直在與一位客戶合作,他要求我們提供他們的數據集,以便在我們為他們製作的移動應用程序中使用。該項目的要求包括能夠使用我們的客戶提供給我們的任何更改來更新移動設備上的本地數據集。本地數據庫將根據移動設備標準儲存在 sqlite 中。

問題

  1. 數據集:我們的客戶只能以 CSV 格式向我們提供他們數據庫的完整轉儲。我們必須能夠僅應用新 CSV 和我們現有數據庫之間的更改,而不會導致重複條目或陳舊數據。
  2. 傳遞:只有對數據集的更改可以發送到移動數據庫。重新發送整個數據庫的成本太高。

方法

目前,我們正在研究的解決方案涉及使用我們的一個後端 MySQL 伺服器來維護儲存在移動 sqlite 數據庫上的數據庫的備份。當一個新數據集到來時,我們計劃用新數據創建一個新數據庫,然後能夠使用 diff 和 patch linux 命令來更新伺服器端數據。但是,使用這種方法,知道手機本地數據庫中更新什麼或如何更新給我們帶來了一些問題。我目前不知道在 Android 或 iOS 環境中使用 MySQL 的更新檔或差異文件的任何方法。

理想方法

最好,當我們收到全新的數據集時,我們希望能夠僅檢測新 CSV 中針對數據庫目前狀態的更改。然後,使用這個更改列表,我們將生成 INSERT/UPDATE/DELETE 語句,這些語句能夠將每個更改應用到 MySQL 和 sqlite 數據庫。我們將儲存每個 INSERT/UPDATE/DELETE 語句的列表以及更新日期,以便根據請求,每個電話都可以根據最新數據進行更新。

但是,我目前也不知道有一種方法可以檢測從新 CSV 到現有數據庫的更改,這使得建構 INSERT/UPDATE/DELETE 語句變得困難。

問題

  1. 以可移植且有意義的格式獲取 CSV 文件和我們目前數據庫實現之間的更改的最佳方法是什麼?
  2. 將這些更改從我們的伺服器端數據庫級聯到手機的本地數據庫的首選方法是什麼?

我目前正在就改進我們的設計或提議的實施尋求任何建議。我覺得我不能成為第一個嘗試將更改反映到數據庫中的 CSV 或將伺服器端數據庫中的更改同步到本地離線數據庫的人。

預先感謝大家的幫助。我期待聽到解決這個問題的替代方法。

將 CSV 文件載入到“暫存”表中。從那裡您可以輕鬆地在單個語句中為每個語句執行 UPDATE/INSERT/DELETE

類似的東西:

update real_table
 set ...
where exists (select 1 from staging_table where ...)

insert into ...
select 
from stage_table
 left join real_table 
where real_table.some_col is NULL

delete real_table
where not exists (select 1 from staging_table)

然後從臨時表中刪除數據。

可能是最快的方法。唯一的缺點是您在數據庫中擁有一個表的數據兩次(直到它從臨時表中刪除)。

引用自:https://dba.stackexchange.com/questions/36218