2014-05-09 51 views
1

首先,一些背景信息,也許有人建議一些更好的方法,然後我嘗試去做。我需要將SQLite數據庫導出到文本文件中。爲此,我必須使用C++並選擇使用CppSQLite庫。如果我放棄一些「特殊」SQLite表會發生什麼

我所做的是收集創建查詢,然後導出每個表數據,問題是有像sqlite_sequencesqlite_statN這樣的表。在導入期間,我無法創建這些表格,因爲這些表格是特殊用途的,所以主要問題是否會影響穩定性,如果這些表格不見了?

問題的另一部分。有沒有辦法使用CppSQLite或C++的任何其他SQLite庫導出和導入SQLite數據庫?

P.S.在這種特殊情況下,複製數據庫文件的方法並不合適。

回答

1

sqlite_開頭的對象名稱保留;即使你想要,你也不能直接創建它們。 (但您更改其中一些內容,您可以刪除sqlite_stat *表。)

當創建具有AUTOINCREMENT列的表時,將自動創建sqlite_sequence表。 首先需要創建表的實際序列值的記錄。 如果要保存/恢復序列值,則必須重新插入舊值。

sqlite_stat *表由ANALYZE創建。 導入SQL文本後運行ANALYZE將是最簡單但很慢的;通過在不會分析的表上運行ANALYZE(例如sqlite_master),然後手動插入舊記錄,可以更快地創建一個空的sqlite_stat *表。

所有這一切都在sqlite3命令行工具的.dump命令來實現(源代碼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> 
+0

謝謝!但是還有一個問題,在插入之前調用'ANALYZE'給出與插入後調用它相同的結果? – ST3

+0

插入什麼? –

+0

插入舊記錄。 – ST3

相關問題