如果我放弃一些特殊的"会发生什么? SQLite表

时间:2014-05-09 07:42:44

标签: c++ sqlite cppsqlite

首先,一些背景信息,也许有人建议我尝试做一些更好的方法。我需要将SQLite数据库导出到文本文件中。为此,我必须使用C ++并选择使用CppSQLite lib。

我这样做是收集创建查询,然后导出每个表数据,问题是有sqlite_sequencesqlite_statN这样的表。在导入过程中,我无法创建这些表,因为这些是特殊目的,因此主要问题是,如果这些表消失,它会影响稳定性吗?

另一部分问题。有没有办法使用CppSQLite或任何其他SQLite lib for C ++导出和导入SQLite数据库?

P.S。在这种特殊情况下,复制数据库文件的解决方案不合适。

1 个答案:

答案 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>