首先,一些背景信息,也许有人建议我尝试做一些更好的方法。我需要将SQLite数据库导出到文本文件中。为此,我必须使用C ++并选择使用CppSQLite lib。
我这样做是收集创建查询,然后导出每个表数据,问题是有sqlite_sequence
和sqlite_statN
这样的表。在导入过程中,我无法创建这些表,因为这些是特殊目的,因此主要问题是,如果这些表消失,它会影响稳定性吗?
另一部分问题。有没有办法使用CppSQLite或任何其他SQLite lib for C ++导出和导入SQLite数据库?
P.S。在这种特殊情况下,复制数据库文件的解决方案不合适。
答案 0 :(得分:1)
保留以sqlite_
开头的对象名称;即使你想要也不能直接创建它们。 (但是你改变了其中一些的内容,你可以删除sqlite_stat
*表。)
创建具有AUTOINCREMENT列的表时,会自动创建sqlite_sequence
表。
首先需要时创建表的实际序列值的记录。
如果要保存/恢复序列值,则必须重新插入旧值。
sqlite_stat
*表由ANALYZE创建。
导入SQL文本后运行ANALYZE将是最简单的,但速度很慢;通过在不会被分析的表(例如sqlite_stat
)上运行ANALYZE,然后手动插入旧记录,可以更快地创建一个空的sqlite_master
*表。
所有这些都在.dump
命令行工具的sqlite3
命令中实现(shell.c
中的源代码):
SQLite version 3.8.4.3 2014-04-03 16:53:12
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> create table t(x integer primary key autoincrement);
sqlite> insert into t default values;
sqlite> insert into t default values;
sqlite> analyze;
sqlite> .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE t(x integer primary key autoincrement);
INSERT INTO "t" VALUES(1);
INSERT INTO "t" VALUES(2);
ANALYZE sqlite_master;
INSERT INTO "sqlite_stat1" VALUES('t',NULL,'2');
DELETE FROM sqlite_sequence;
INSERT INTO "sqlite_sequence" VALUES('t',2);
COMMIT;
sqlite>