SQLite 資料庫通常儲存在單一常規磁碟檔案中。不過,在特定情況下,資料庫可能會儲存在記憶體中。
強制 SQLite 資料庫完全存在於記憶體中的最常見方式,是使用特殊檔名「:memory:」開啟資料庫。換句話說,不要將實際磁碟檔案的名稱傳遞給 sqlite3_open()、sqlite3_open16() 或 sqlite3_open_v2() 函式之一,而是傳遞字串「:memory:」。例如
rc = sqlite3_open(":memory:", &db);
執行此操作時,不會開啟任何磁碟檔案。相反地,會在記憶體中建立一個新的資料庫。資料庫會在資料庫連線關閉後立即停止存在。每個 :memory: 資料庫都與其他資料庫不同。因此,開啟兩個資料庫連線,每個連線的檔名都是「:memory:」,將會建立兩個獨立的內存資料庫。
特殊檔名「:memory:」可以在允許資料庫檔名的任何地方使用。例如,它可以用作 ATTACH 命令中的檔名
ATTACH DATABASE ':memory:' AS aux1;
請注意,為了套用特殊名稱「:memory:」並建立純內存資料庫,檔名中不能有其他文字。因此,可以在檔案中建立基於磁碟的資料庫,方法是加上路徑名稱,如下所示:./:memory:。
使用 URI 檔名 時,特殊檔名「:memory:」也會運作。例如
或rc = sqlite3_open("file::memory:", &db);
ATTACH DATABASE 'file::memory:' AS aux1;
如果使用 URI 檔名 開啟內存資料庫,則允許內存資料庫使用 共用快取。如果使用未加修飾的「:memory:」名稱來指定內存資料庫,則該資料庫始終具有私密快取,而且只對最初開啟它的資料庫連線可見。不過,可以透過下列方式讓兩個或多個資料庫連線開啟同一個內存資料庫
或rc = sqlite3_open("file::memory:?cache=shared", &db);
ATTACH DATABASE 'file::memory:?cache=shared' AS aux1;
這允許不同的資料庫連線共用同一個記憶體中的資料庫。當然,所有共用記憶體中資料庫的資料庫連線都必須在同一個程序中。當最後一個連線到資料庫關閉時,資料庫會自動刪除,並回收記憶體。
如果在單一程序中需要兩個或更多個不同的但可共用的記憶體中資料庫,則可以將 mode=memory 查詢參數與 URI 檔案名稱 一起使用,以建立一個具名稱的記憶體中資料庫
或rc = sqlite3_open("file:memdb1?mode=memory&cache=shared", &db);
ATTACH DATABASE 'file:memdb1?mode=memory&cache=shared' AS aux1;
當記憶體中資料庫以這種方式命名時,它只會與使用完全相同名稱的另一個連線共用其快取。
當傳遞給 sqlite3_open() 或 ATTACH 的資料庫檔案名稱為空字串時,就會建立一個新的暫時檔案來儲存資料庫。
rc = sqlite3_open("", &db);
ATTACH DATABASE '' AS aux2;
每次都會建立一個不同的暫時檔案,因此,就像特殊字串「:memory:」一樣,兩個連線到暫時資料庫的資料庫連線各自都有自己的私人資料庫。暫時資料庫會在建立它們的連線關閉時自動刪除。
即使會為每個暫時資料庫分配一個磁碟檔案,但實際上暫時資料庫通常駐留在記憶體中分頁快取中,因此,由「:memory:」建立的純記憶體中資料庫和由空檔名建立的暫時資料庫之間幾乎沒有差異。唯一的差異在於「:memory:」資料庫必須始終保留在記憶體中,而暫時資料庫的部分可能會在資料庫變大或 SQLite 處於記憶體壓力下時沖洗到磁碟中。
前幾段描述了在預設 SQLite 組態下暫時資料庫的行為。如果需要,應用程式可以使用 temp_store pragma 和 SQLITE_TEMP_STORE 編譯時間參數,強制暫時資料庫表現得像純記憶體中資料庫。