合并两个 Sqlite 文件

设有两个 Sqlite 文件,其中名为 data 的表,表的结构是相同的,我们如何将其中一个数据库的数据导入到的另一个数据库中呢?

具体的做法是使用 csv 文件作为中间媒介。设我们想要将 A 数据库中的数据转移到 B 数据库中。在 A 数据库中,使用

1
.mode csv

将输出模式设置为 csv 格式,然后运行

1
.output temp.csv

将输出目标从 STDOUT 更改为一个文件 temp.csv。然后我们可以用 SELECT 语句筛选出需要转移的数据。例如

1
select * from data

此时在 dbA.sqlite3 同目录下会生成一个名为 temp.csv 的文件。我们将这个文件复制到数据库 B 的目录下,然后打开运行数据库 B。同样,需要先切换到 csv 模式

1
.mode cvs

然后运行

1
.import temp.csv data

就可以将输入导入到 B 的 data 表中了。

.import 的效率很高,因此如果我们有大量的数据需要导入到数据库,比起遍历式地使用 insert 指令,我们可以将数据整理成 csv 格式,然后使用 .import 命令导入数据。


不过,这个方案无法解决自增的 ID 域的问题。如果两个文件中的 ID 域是不重复的,我们可以保留原来数据库 A 中的 ID,那么直接 .import 没有问题。而如果 ID 可能出现重复,我们需要为插入的新数据分配新的 ID 时,这种方法问题就有问题了。

此时我们可以在数据库 B 中创建一个临时的表,表的结构和 data 相似,但是没有 ID 字段。我们从数据库 A 导出数据时,不导出 ID 数据,然后将数据读入 temp 表。然后使用 insert 语句将数据从 temp 插入到 data 表。在转换换成以后删除 temp