2011-01-14 52 views
0

私は2つのsqliteファイルを持っています.1つは古いもので、もう1つは最初のものと比べて新しいデータです。 2つのsqliteファイルを1つのコマンドと比較することは可能ですか?違いがあれば更新しますか?2つのsqliteファイルを比較することは可能ですか?

あなたは、彼らが異なっているか否かを決定するために、行の数を数えることができる任意のコメントに

おかげ

+0

私はあなたが望むものはバイナリdiffingだと思います。 [この回答を参照してください](http://stackoverflow.com/questions/4580368/how-can-i-diff-2-sqlite-files) – bpercevic

答えて

2

単一コマンドはありません。しかし、いくつかはSQLite DB comparision toolsです。そして、あなた自身で似たようなことを達成することができます。私は2つの基本的な方法を見る。

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方法"コードを書こうとしてくれてありがとう。しかし実際には、すべてのデータが両方のテーブルから複数回(少なくとも4回)取り出され、デフォルトの照合を使用して列ごとに比較されるため、大きなテーブルではこれが遅くなると思います。 http://www.sqlite.org/lang_select.htmlを参照してください。 –

0

を歓迎、しかし、「古いものを」更新する方法を決定するために非自明です。 2つのファイルにアクセスできるので、最も簡単な方法は、古いテーブルを新しいテーブルと同じにする場合です。

1)行を数えます。古い場合<新規: 2)古いテーブルを切り捨てます 3)新しいテーブルのすべての行を選択し、古いテーブルに挿入します。

+0

行数の変更のみを処理する場合は、行を処理しませんコンテンツの変更。 UPDATEステートメントが実行されていると、変更が失われます。だからIMHOは良い解決策ではありません。 –

1

このような機能のための直接コマンドはありません。

トリガーを使用して、データベースに加えられたすべての変更(INSERT/UPDATE/DELETE)の「ジャーナル」を含む別のリストを作成し、古いものに対して実行することができます。

しかし、このようなトリガをインストールする可能性がない場合は、すべてのファイル行を読み込み、新しい行が古いテーブル内で同じかどうかをテストし、UPDATE/INSERT/DELETE。

2番目の解決策は遅くなります。新しいコンテンツをすべて読み込んだ後、古いテーブルのすべての行コンテンツを検索する必要があります。

は非常に速く解決のために、私は3つのだけの可能性を参照してください:

  1. は、古いファイルの代わりに新しいファイルをコピーします。それは速くて安全です。次に、VACCUMセーブ・スペースを実行します。しかし、新しいファイルはコピー中にロックされます。
  2. 2つのファイルのbinary diffを作成してください。それはいくつかのケースではより速くなる可能性があります。しかし、新しいファイルは差分中にもロックされます。
  3. 新しいファイルをロックしたくない場合は、新しいテーブルのバックアップを新しいファイルに作成します。 SQLite online Backup APIページをご覧ください。しかし、誰かが新しいテーブルに書き込むと、バックアップは最初から再開されるので、どちらも完璧ではありません!

高速バイナリ差分の場合、our source code repositoryにはデルファイ最適化ユニット(FOSSもあります)があります。

+0

誰もコメントなしでこの-1を作ったのは誰ですか? ;) –

関連する問題