是否可以比较2个sqlite文件并进行更新

时间:2011-01-14 02:45:43

标签: cocoa delphi sqlite

我有2个sqlite文件,一个较旧,另一个有一些新数据与第一个相比较。 是否可以将2个sqlite文件与任何单个命令进行比较,如果有任何差异,是否可以更新?

欢迎任何评论

由于

3 个答案:

答案 0 :(得分: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之类的工具来比较两个输出。

答案 1 :(得分:1)

没有这种功能的直接命令。

您可以使用触发器,然后创建一个单独的列表,其中包含对数据库进行的所有修改(INSERT / UPDATE / DELETE)的“日志”,然后针对旧版本运行它。

但是如果你没有任何可能安装这样的触发器,你将必须读取所有文件行,然后测试旧表中的新行是否相同,并进行UPDATE / INSERT / DELETE

第二种解决方案将会很慢:您必须阅读所有新内容,然后搜索旧表中的每一行内容。

因此,对于快速解决方案,我只看到三种可能性:

  1. 复制新文件以代替旧文件。它将是快速和安全的。然后运行VACCUM保存空间。但是在复制过程中新文件将被锁定。
  2. 制作两个文件中的binary diff。在某些情况下可能会更快。但新文件也将在差异中被锁定。
  3. 如果您不想锁定新文件,请将新表备份到新文件中。请参阅SQLite online Backup API页面。但是如果有人写入新表,备份将从头开始重启......所以它也不完美!
  4. 对于快速二进制差异,our source code repository中有一个Delphi优化单元(也是FOSS)。

答案 2 :(得分:0)

您可以计算行数以确定它们是否不同,但是,决定如何更新“旧版本”并非易事。既然您可以访问这两个文件,那么最简单的方法是imo,如果您只想让旧表与新表一样:

1)计算行数。如果旧的<新的: 2)截断旧表 3)选择新表中的所有行并将它们插入旧表中。