2011-01-14 76 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

相关问题