显示两个 SQLite 数据库的差异,忽略 rowid

问题描述 投票:0回答:2

首先,我创建一个数据库,其中一个表包含两条记录:

C:\Software\sqlite-tools-win32-x86-3360000>sqlite3.exe
SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .open test.db
sqlite> CREATE TABLE people(first_name TEXT, last_name TEXT, PRIMARY KEY([first_name], [last_name]));
sqlite> INSERT INTO people(first_name, last_name) VALUES ("John", "Doe");
sqlite> INSERT INTO people(first_name, last_name) VALUES ("Jane", "Doe");
sqlite> .quit

然后我复制了数据库并检查它们是否相等:

C:\Software\sqlite-tools-win32-x86-3360000>copy test.db test2.db
        1 file(s) copied.

C:\Software\sqlite-tools-win32-x86-3360000>sqldiff.exe test.db test2.db

C:\Software\sqlite-tools-win32-x86-3360000>

然后我删除了第一条记录并再次添加了该记录:

C:\Software\sqlite-tools-win32-x86-3360000>sqlite3.exe
SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .open test2.db
sqlite> DELETE FROM people WHERE first_name = 'John' AND last_name = 'Doe';
sqlite> INSERT INTO people(first_name, last_name) VALUES ("John", "Doe");
sqlite> .quit

之后我再次比较了两个数据库:

C:\Software\sqlite-tools-win32-x86-3360000>sqldiff.exe test.db test2.db
DELETE FROM people WHERE rowid=1;
INSERT INTO people(rowid,first_name,last_name) VALUES(3,'John','Doe');

C:\Software\sqlite-tools-win32-x86-3360000>

我理解输出,因为记录“John”“Doe”的 rowid 不同。

但是,我不关心用例中的 rowid。

如何查看两个数据库/表的差异,只要可查询的数据相等,就认为它们相等?

换句话说,只要除了 rowid 之外的所有值都相同,两条记录就应该被视为相等...

sqlite
2个回答
0
投票

如果可以接受使用第三方工具,我可以建议KS DB Merge for SQLite。它通过主键而不是 rowid 来比较数据。提供免费版本,以下是使用这些数据库的免费版本的屏幕截图: 任何更改都会突出显示。它对表和PK中的列数有一些限制,但支持两列键。 我是该工具的作者。


0
投票

来自

sqldiff
文档链接

--primarykey 标志稍微改变了配对算法,以便架构声明的 PRIMARY KEY 始终用于配对,即使在具有 rowid 的表上也是如此。这通常是查找差异的更好选择,但是,如果行的一个或多个 PRIMARY KEY 列设置为 NULL,则可能会导致遗漏差异。

您可以通过以下方式执行此操作:

sqldiff.exe --primarykey db1.db db2.db

© www.soinside.com 2019 - 2024. All rights reserved.