2011-01-14 81 views
0

我有2個sqlite的文件,一個是年紀大了,另外一個有一些新的數據進行比較,以第一個。 是否有可能將2個sqlite文件與任何單個命令進行比較,如果有任何區別,是否需要更新?是否有可能比較2個sqlite的文件和更新

歡迎任何評論

感謝

+0

我想你想要的是二元差異。看看[這個答案](http://stackoverflow.com/questions/4580368/how-can-i-diff-2-sqlite-files) – bpercevic 2015-02-11 20:18:21

回答

2

沒有單一的命令。但有一些SQLite DB comparision tools。你可以自己實現類似的功能。我看到兩種基本方法。

SQL方式。打開X數據庫,然後附加到Y數據庫。使用SELECT ... FROM X.sqlite_master獲取X數據庫的表列表。遍歷列表並執行查詢:

SELECT * FROM x.tab 
EXCEPT 
SELECT * FROM y.tab 
UNION ALL 
SELECT * FROM y.tab 
EXCEPT 
SELECT * FROM x.tab 

這將返回每個表的表內容差異。現在,對於此查詢返回的每一行,您都可以執行REPLACE SQL命令。

工具的方式。相當有趣,但這種方法也可用於手動同步。使用SQLite.exe工具。打開其中的X數據庫並執行.output和.dump命令。對X數據庫重複相同的操作。使用Beyond Compare等工具來比較兩個輸出。

+0

感謝您編寫「SQL方式」代碼。但實際上,我猜這對於大表來說會比較慢,因爲所有數據都將從兩個表中多次檢索(至少四次),然後使用默認歸類逐列比較。請參閱http://www.sqlite.org/lang_select.html – 2011-01-15 13:52:49

0

你可以指望的行數,以確定他們是否是不同的,但是,它是不平凡的,以決定如何更新「舊的一個」。既然你有機會獲得這兩個文件,最簡單的方法,海事組織,如果你只想讓舊錶一樣的新的一個是:

1)計算行數。如果舊<新:那麼: 2)截斷舊錶 3)選擇新表中的所有行並將它們插入到舊錶中。

+0

如果你只處理行數的變化,你不會處理行內容修改。如果有任何UPDATE語句已經運行,您將放棄更改。所以恕我直言不是一個好的解決方案 – 2011-01-14 06:45:26

1

這樣的功能沒有直接的命令。

你可以使用一個觸發器,然後進行包含所有的修改(INSERT/UPDATE/DELETE)對數據庫進行的「日記」一個單獨的列表,然後運行它不服老。

但是,如果您沒有任何安裝這種觸發器的可能性,則必須讀取所有文件行,然後測試舊錶中的新行是否相同,然後創建UPDATE/INSERT /刪除。

第2解決方案將慢死了:你必須閱讀所有的新內容,然後搜索舊錶的每一行的內容。

所以對於一個快速的解決方案,我只看到了三種可能性:

  1. 複製來代替舊文件的新文件。這將是快速和安全的。然後運行VACCUM保存空間。但新文件將在複製過程中被鎖定。
  2. 製作binary diff這兩個文件。在某些情況下可能會更快。但是新文件在差異期間也會被鎖定。
  3. 如果您不希望鎖定新文件,請將新表備份到新文件中。請參閱SQLite online Backup API頁面。但是如果有人寫信給新表,備份將從頭開始......所以它也不完美!

對於快速二進制比較,在our source code repository中有一個德爾福優化單元(也是FOSS)。

+0

誰做了這個-1沒有任何評論? ;) – 2011-01-18 11:15:44

相關問題