设有两个 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
。