PRAGMA 陳述式是 SQLite 特有的 SQL 擴充功能,用於修改 SQLite 函式庫的操作或查詢 SQLite 函式庫的內部(非表格)資料。PRAGMA 陳述式使用與其他 SQLite 命令(例如 SELECT、INSERT)相同的介面發出,但在以下幾個重要方面有所不同:
SQLite 的 C 語言 API 提供了 SQLITE_FCNTL_PRAGMA 檔案控制,讓 VFS 實作有機會新增新的 PRAGMA 陳述式或覆寫內建 PRAGMA 陳述式的意義。
Pragma 可以接受零個或一個參數。參數可以放在括號中,也可以用等號與 pragma 名稱分隔。兩種語法產生相同的結果。在許多 pragma 中,參數是布林值。布林值可以是以下其中之一:
關鍵字參數可以選擇性地用引號括起來。(例如'yes' [FALSE]。)有些 pragma 接受字串字面值作為其參數。當 pragma 接受關鍵字參數時,它通常也會接受數值等效項。例如,「0」和「no」的含義相同,「1」和「yes」也是如此。查詢設定值時,許多 pragma 會傳回數字而不是關鍵字。
Pragma 在 pragma 名稱之前可以有一個可選的 schema-name。schema-name 是 ATTACH 的資料庫的名稱,或是主資料庫和 TEMP 資料庫的「main」或「temp」。如果省略了可選的 schema 名稱,則假設為「main」。在某些 pragma 中,schema 名稱沒有意義,只會被忽略。在以下文件中,schema 名稱有意義的 pragma 會以「schema.」前綴顯示。
對於會返回結果且沒有副作用的 PRAGMA,可以從普通的 SELECT 語句中以 表值函數 (Table-Valued Function) 的形式存取。對於每個參與的 PRAGMA,其對應的表值函數名稱與 PRAGMA 名稱相同,但會加上一個 7 個字元的 "pragma_" 前綴。PRAGMA 的參數和綱要(如果有)會作為參數傳遞給表值函數,綱要作為一個可選的最後一個參數。
例如,可以使用 index_info pragma 讀取索引中欄位的資訊,如下所示:
PRAGMA index_info('idx52');
或者,可以使用以下方式讀取相同的內容:
SELECT * FROM pragma_index_info('idx52');
使用表值函數格式的優點是查詢可以只返回 PRAGMA 欄位的子集、可以包含 WHERE 子句、可以使用聚合函數,並且表值函數可以是 JOIN 中的幾個資料來源之一。例如,要取得綱要中所有索引欄位的列表,可以查詢:
SELECT DISTINCT m.name || '.' || ii.name AS 'indexed-columns' FROM sqlite_schema AS m, pragma_index_list(m.name) AS il, pragma_index_info(il.name) AS ii WHERE m.type='table' ORDER BY 1;
補充說明
表值函數僅適用於內建的 PRAGMA,不適用於使用 SQLITE_FCNTL_PRAGMA 檔案控制定義的 PRAGMA。
表值函數僅適用於會返回結果且沒有副作用的 PRAGMA。
此功能可用於實作 資訊綱要 (Information Schema),方法是先使用以下指令建立一個獨立的綱要:
然後在該綱要中建立 VIEW (視圖),使用表值 PRAGMA 函數來實作正式的資訊綱要表格。ATTACH ':memory:' AS 'information_schema';
PRAGMA 的表值函數功能是在 SQLite 3.16.0 版 (2017-01-02) 中新增的。先前的 SQLite 版本無法使用此功能。
注意事項
PRAGMA analysis_limit;
PRAGMA analysis_limit = N;
查詢或更改 近似 ANALYZE 設定的限制。這是 ANALYZE 指令在每個索引中大約檢查的資料列數。如果省略參數 N,則分析限制保持不變。如果限制為零,則停用分析限制,ANALYZE 指令將檢查每個索引的所有資料列。如果 N 大於零,則分析限制設定為 N,後續的 ANALYZE 指令將在檢查每個索引大約 N 列後停止分析。如果 N 是負數或非整數值,則 pragma 的行為如同省略了 N 參數。在所有情況下,傳回值都是用於後續 ANALYZE 指令的新分析限制。
這個 pragma 可用於幫助 ANALYZE 指令在大型資料庫上更快地執行。當只檢查每個索引的一部分時,分析結果不如完整分析好,但通常已經足夠。將 N 設定為 100 或 1000 允許 ANALYZE 指令快速執行,即使在巨大的資料庫檔案上也是如此。
此 pragma 已在 SQLite 版本 3.32.0 (2020-05-22) 中新增。目前的實作僅使用 N 值的低 31 位元 - 更高位的位元會被忽略。未來版本的 SQLite 可能會開始使用更高位的位元。
從 SQLite 版本 3.46.0 (2024-05-23) 開始,執行 ANALYZE 的建議方法是使用 PRAGMA optimize 指令。PRAGMA optimize 會自動設定合理的暫時分析限制,以確保 PRAGMA optimize 指令即使在巨大的資料庫上也能快速完成。使用 PRAGMA optimize 而不是直接執行 ANALYZE 的應用程式不需要設定分析限制。
PRAGMA schema.application_id;
PRAGMA schema.application_id = integer ;
application_id PRAGMA 用於查詢或設定位於 資料庫標頭 偏移量 68 處的 32 位元有號大端序「應用程式 ID」整數。使用 SQLite 作為其 應用程式檔案格式 的應用程式應將應用程式 ID 整數設定為唯一的整數,以便諸如 file(1) 之類的工具可以判斷特定的檔案類型,而不只是回報「SQLite3 資料庫」。可以參考 SQLite 原始碼儲存庫中的 magic.txt 檔案來查看已分配的應用程式 ID 清單。
另請參閱 user_version pragma。
PRAGMA schema.auto_vacuum;
PRAGMA schema.auto_vacuum = 0 | NONE | 1 | FULL | 2 | INCREMENTAL;
查詢或設定資料庫中的自動真空狀態。
自動真空的預設設定為 0 或「none」,除非使用 SQLITE_DEFAULT_AUTOVACUUM 編譯時選項。「none」設定表示自動真空已停用。當自動真空停用且從資料庫中刪除資料時,資料庫檔案大小保持不變。未使用的資料庫檔案頁面會新增到「可用空間清單」並重複用於後續的插入。因此不會損失資料庫檔案空間。但是,資料庫檔案不會縮小。在此模式下,可以使用 VACUUM 指令重建整個資料庫檔案,從而回收未使用的磁碟空間。
當自動真空模式為 1 或「full」時,可用空間清單頁面會移動到資料庫檔案的末尾,並且資料庫檔案會在每次交易提交時截斷以移除可用空間清單頁面。但請注意,自動真空只會從檔案中截斷可用空間清單頁面。自動真空不會像 VACUUM 指令那樣對資料庫進行碎片整理或重新打包個別的資料庫頁面。事實上,因為它會在檔案中移動頁面,自動真空實際上可能會使碎片更嚴重。
自動真空功能只有在資料庫儲存一些額外的資訊,允許每個資料庫頁面回溯到其參考來源時才可使用。因此,必須在建立任何資料表之前開啟自動真空功能。建立資料表後,無法啟用或停用自動真空功能。
當 auto-vacuum 的值為 2 或 "incremental" 時,執行自動真空所需的額外資訊會儲存在資料庫檔案中,但不像 auto_vacuum=full 時,自動真空不會在每次提交時自動執行。在增量模式下,必須呼叫單獨的 incremental_vacuum 指令碼以觸發自動真空。
資料庫連線可以隨時在完整和增量自動真空模式之間切換。但是,從「none」更改為「full」或「incremental」只能在資料庫是新的(尚未建立任何資料表)時,或透過執行 VACUUM 命令來完成。要更改自動真空模式,首先使用 auto_vacuum 指令碼設定新的所需模式,然後呼叫 VACUUM 命令來重組整個資料庫檔案。要從「full」或「incremental」改回「none」,即使在空的資料庫上也始終需要執行 VACUUM。
當不帶任何參數呼叫 auto_vacuum 指令碼時,它會返回目前的自動真空模式。
PRAGMA automatic_index;
PRAGMA automatic_index = boolean;
查詢、設定或清除自動索引功能。
從 3.7.17 版 (2013-05-20) 開始,自動索引 預設為啟用,但这在未来的 SQLite 版本中可能会改变。
PRAGMA busy_timeout;
PRAGMA busy_timeout = milliseconds;
查詢或更改忙碌逾時的設定。此指令碼是 sqlite3_busy_timeout() C 語言介面的替代方案,它以指令碼的形式提供,以便與不提供直接存取 sqlite3_busy_timeout() 的語言繫結一起使用。
每個資料庫連線只能有一個忙碌處理器。此 PRAGMA 會設定程序的忙碌處理器,可能會覆寫先前設定的任何忙碌處理器。
PRAGMA schema.cache_size;
PRAGMA schema.cache_size = pages;
PRAGMA schema.cache_size = -kibibytes;
查詢或更改 SQLite 建議每個已開啟資料庫檔案一次在記憶體中保存的資料庫磁碟頁面數上限。是否遵循此建議由應用程式定義的頁面快取決定。內建於 SQLite 的預設頁面快取會遵循此要求,但其他應用程式定義的頁面快取實作可能會選擇以不同的方式詮釋建議的快取大小,或完全忽略它。預設建議的快取大小為 -2000,這表示快取大小限制為 2048000 位元組的記憶體。可以使用 SQLITE_DEFAULT_CACHE_SIZE 編譯時期選項更改預設建議的快取大小。TEMP 資料庫的預設建議快取大小為 0 頁。
如果參數 N 為正數,則建議的快取大小設定為 N。如果參數 N 為負數,則快取頁面數會調整為根據目前的頁面大小使用大約 abs(N*1024) 位元組記憶體的頁面數。SQLite 記住的是頁面快取中的頁面數,而不是使用的記憶體量。因此,如果您使用負數設定快取大小,然後更改頁面大小(使用 PRAGMA page_size 命令),則最大快取記憶體量將與頁面大小的更改成比例地增加或減少。
回溯相容性注意事項:在 3.7.10 版 (2012-01-16) 之前,cache_size 搭配負數 N 的行為有所不同。在早期版本中,快取中的頁數會被設定為 N 的絕對值。
當您使用 cache_size 指令修改快取大小時,變更只會持續到目前的連線階段。當資料庫關閉並重新開啟後,快取大小會恢復為預設值。
預設的頁面快取實作並不會一次配置全部的快取記憶體。快取記憶體會根據需要以較小的區塊進行配置。page_cache 設定是快取可以使用的記憶體量的(建議)上限,而不是它一直會使用的記憶體量。這是預設頁面快取實作的行為,但應用程式定義的頁面快取可以自由地表現出不同的行為。
PRAGMA cache_spill;
PRAGMA cache_spill=布林值;
PRAGMA 綱要.cache_spill=N;
cache_spill 指令可以啟用或停用分頁器在交易過程中將髒快取頁面溢出到資料庫檔案的功能。Cache_spill 預設為啟用,大多數應用程式應該保持這個設定,因為快取溢出通常是有利的。然而,快取溢出會產生取得資料庫檔案獨佔鎖定 (EXCLUSIVE lock) 的副作用。因此,某些具有長時間執行交易的應用程式可能希望停用快取溢出,以防止應用程式在交易提交 (COMMIT) 之前取得資料庫的獨佔鎖定。
這個指令的「PRAGMA cache_spill=N」形式設定了發生溢出所需的最小快取大小閾值。快取中的頁數必須同時超過 cache_spill 閾值和由 PRAGMA cache_size 陳述式設定的最大快取大小,才會發生溢出。
這個指令的「PRAGMA cache_spill=布林值」形式適用於連接到資料庫連線的所有資料庫。但「PRAGMA cache_spill=N」形式的陳述式僅適用於「主要」綱要或陳述式中指定的任何其他綱要。
PRAGMA case_sensitive_like = 布林值;
LIKE 運算子的預設行為是忽略 ASCII 字元的區分大小寫。因此,預設情況下,'a' LIKE 'A' 為真。case_sensitive_like 指令會安裝一個新的應用程式定義的 LIKE 函數,根據 case_sensitive_like 指令的值,該函數區分大小寫或不區分大小寫。當 case_sensitive_like 被停用時,會使用預設的 LIKE 行為。當 case_sensitive_like 被啟用時,大小寫就會變得重要。因此,例如,'a' LIKE 'A' 為假,但 'a' LIKE 'a' 仍然為真。
這個指令使用 sqlite3_create_function() 來覆蓋 LIKE 和 GLOB 函數,這可能會覆蓋應用程式先前註冊的 LIKE 和 GLOB 實作。這個指令只會更改 SQL LIKE 運算子的行為。它不會更改 sqlite3_strlike() C 語言介面的行為,該介面永遠不區分大小寫。
警告:如果資料庫在綱要中的任何地方使用 LIKE 運算子,例如在 CHECK 約束 中、運算式索引 中或 部分索引 的 WHERE 子句中,則使用此 PRAGMA 更改 LIKE 運算子的定義可能會導致資料庫看起來損壞。PRAGMA integrity_check 將會回報錯誤。資料庫實際上並沒有損壞,因為將 LIKE 的行為改回定義綱要和填入資料庫時的行為就能解決問題。如果 LIKE 的使用僅發生在索引中,則可以透過執行 REINDEX 來解決問題。儘管如此,仍然不建議使用 case_sensitive_like 指令。
這個編譯指示已被棄用,僅為了向後相容性而存在。新的應用程式應避免使用此編譯指示。舊的應用程式應儘早停止使用此編譯指示。當 SQLite 使用 SQLITE_OMIT_DEPRECATED 編譯時,可以從建置中省略此編譯指示。
PRAGMA cell_size_check
PRAGMA cell_size_check = boolean;
cell_size_check 編譯指示用於啟用或停用對從磁碟初始讀取的資料庫 B 樹頁面進行額外完整性檢查。啟用儲存格大小檢查後,可以更早地偵測到資料庫損壞,並且不太可能「擴散」。然而,執行額外檢查會導致效能略微下降,因此預設情況下會關閉儲存格大小檢查。
PRAGMA checkpoint_fullfsync
PRAGMA checkpoint_fullfsync = boolean;
查詢或更改 檢查點 操作的 fullfsync 旗標。如果設定了此旗標,則在支援 F_FULLFSYNC 的系統上執行檢查點操作期間,將使用 F_FULLFSYNC 同步方法。 checkpoint_fullfsync 旗標的預設值為關閉。只有 Mac OS-X 支援 F_FULLFSYNC。
如果設定了 fullfsync 旗標,則所有同步操作都將使用 F_FULLFSYNC 同步方法,並且 checkpoint_fullfsync 設定將無關緊要。
PRAGMA collation_list;
返回目前資料庫連線定義的排序序列清單。
PRAGMA compile_options;
此編譯指示會返回建置 SQLite 時使用的 編譯時選項 名稱,每行一個選項。返回的選項名稱中省略了「SQLITE_」前綴。另請參閱 sqlite3_compileoption_get() C/C++ 介面和 sqlite_compileoption_get() SQL 函式。
PRAGMA count_changes;
PRAGMA count_changes = boolean;
查詢或更改 count-changes 旗標。通常,當未設定 count-changes 旗標時,INSERT、UPDATE 和 DELETE 陳述式不會返回任何資料。設定 count-changes 後,這些命令中的每一個都會返回單行資料,其中包含一個整數值,即命令插入、修改或刪除的行數。返回的更改計數不包括觸發器執行的任何插入、修改或刪除,外鍵動作 自動進行的任何更改,或由 upsert 引起的更新。
取得列更改計數的另一種方法是使用 sqlite3_changes() 或 sqlite3_total_changes() 介面。不過,兩者之間存在細微的差異。當使用 INSTEAD OF 觸發器 對檢視執行 INSERT、UPDATE 或 DELETE 時,count_changes 編譯指示會報告觸發觸發器的檢視中的行數,而 sqlite3_changes() 和 sqlite3_total_changes() 則不會。
這個編譯指示已被棄用,僅為了向後相容性而存在。新的應用程式應避免使用此編譯指示。舊的應用程式應儘早停止使用此編譯指示。當 SQLite 使用 SQLITE_OMIT_DEPRECATED 編譯時,可以從建置中省略此編譯指示。
PRAGMA data_store_directory;
PRAGMA data_store_directory = '目錄名稱';
查詢或更改 sqlite3_data_directory 全域變數的值,Windows 作業系統介面後端使用該變數來決定將使用相對路徑名稱指定的資料庫檔案儲存在哪裡。
更改 data_store_directory 設定不是執行緒安全的。如果應用程式中的另一個執行緒同時執行任何 SQLite 介面,則切勿更改 data_store_directory 設定。否則會導致未定義的行為。更改 data_store_directory 設定會寫入 sqlite3_data_directory 全域變數,而該全域變數不受互斥鎖保護。
此功能提供給 WinRT 使用,因為 WinRT 沒有作業系統機制可以讀取或更改目前的 working directory。不建議在其他情況下使用此 pragma,未來版本可能會禁止使用。
這個編譯指示已被棄用,僅為了向後相容性而存在。新的應用程式應避免使用此編譯指示。舊的應用程式應儘早停止使用此編譯指示。當 SQLite 使用 SQLITE_OMIT_DEPRECATED 編譯時,可以從建置中省略此編譯指示。
PRAGMA schema.data_version;
「PRAGMA data_version」指令會指示資料庫檔案是否已被修改。將資料庫內容儲存在記憶體中或在螢幕上顯示資料庫內容的互動式程式可以使用 PRAGMA data_version 指令來判斷是否需要清除並重新載入其記憶體或更新螢幕顯示。
如果在此期間任何其他連線已將變更提交到資料庫,則從同一個連線兩次呼叫「PRAGMA data_version」所傳回的整數值將會不同。對於在同一個資料庫連線上提交的變更,「PRAGMA data_version」值保持不變。「PRAGMA data_version」的行為對於所有資料庫連線都相同,包括個別處理程序中的資料庫連線和共用快取資料庫連線。
「PRAGMA data_version」值是每個資料庫連線的區域屬性,因此即使基礎資料庫相同,在不同資料庫連線上同時呼叫「PRAGMA data_version」兩次所傳回的值通常也會不同。只有比較同一個資料庫連線在兩個不同時間點傳回的「PRAGMA data_version」值才有意義。
PRAGMA database_list;
此 pragma 的作用類似查詢,會針對附加到目前資料庫連線的每個資料庫傳回一行。第二欄是主要資料庫檔案的「main」、用於儲存 TEMP 物件的資料庫檔案的「temp」或其他資料庫檔案的附加資料庫名稱。第三欄是資料庫檔案本身的名稱,如果資料庫未與檔案關聯,則為空字串。
此 pragma 查詢或設定每個開啟的資料庫檔案將配置的建議磁碟快取頁數上限。此 pragma 與 cache_size 的不同之處在於,這裡設定的值會在資料庫連線之間持續存在。預設快取大小的值儲存在資料庫檔案標頭中偏移量 48 處的 4 位元組大端序整數中。
這個編譯指示已被棄用,僅為了向後相容性而存在。新的應用程式應避免使用此編譯指示。舊的應用程式應儘早停止使用此編譯指示。當 SQLite 使用 SQLITE_OMIT_DEPRECATED 編譯時,可以從建置中省略此編譯指示。
PRAGMA defer_foreign_keys
PRAGMA defer_foreign_keys = 布林值;
當 defer_foreign_keys PRAGMA 啟用時,所有外部鍵約束的強制執行會延遲到最外層交易提交為止。 defer_foreign_keys pragma 預設為 OFF,因此只有在建立外部鍵約束為「DEFERRABLE INITIALLY DEFERRED」時才會延遲。 defer_foreign_keys pragma 會在每次 COMMIT 或 ROLLBACK 時自動關閉。因此,每個交易都必須分別啟用 defer_foreign_keys pragma。當然,此 pragma 只有在啟用外部鍵約束時才有意義。
在交易期間可以使用 sqlite3_db_status(db,SQLITE_DBSTATUS_DEFERRED_FKS,...) C 語言介面來判斷是否有延遲且未解決的外部鍵約束。
PRAGMA empty_result_callbacks;
PRAGMA empty_result_callbacks = 布林值;
查詢或更改 empty-result-callbacks 旗標。
empty-result-callbacks 旗標僅影響 sqlite3_exec() API。通常,當 empty-result-callbacks 旗標清除時,提供給 sqlite3_exec() 的回呼函式不會針對傳回零資料列的命令被呼叫。在這種情況下,如果設定了 empty-result-callbacks,則回呼函式會被呼叫一次,且第三個參數設為 0 (NULL)。這是為了讓使用 sqlite3_exec() API 的程式即使在查詢未傳回任何資料時也能擷取欄位名稱。
這個編譯指示已被棄用,僅為了向後相容性而存在。新的應用程式應避免使用此編譯指示。舊的應用程式應儘早停止使用此編譯指示。當 SQLite 使用 SQLITE_OMIT_DEPRECATED 編譯時,可以從建置中省略此編譯指示。
PRAGMA encoding;
PRAGMA encoding = 'UTF-8';
PRAGMA encoding = 'UTF-16';
PRAGMA encoding = 'UTF-16le';
PRAGMA encoding = 'UTF-16be';
在第一種形式中,如果主要資料庫已經建立,則此編碼指令會傳回主要資料庫使用的文字編碼,即 'UTF-8'、'UTF-16le'(小端序 UTF-16 編碼)或 'UTF-16be'(大端序 UTF-16 編碼)其中之一。如果主要資料庫尚未建立,則傳回的值是將用於建立主要資料庫的文字編碼(如果由這個工作階段建立)。
此編碼指令的第二到第五種形式設定如果主要資料庫由這個工作階段建立時將使用的編碼。字串 'UTF-16' 會被解譯為「使用原生機器位元組順序的 UTF-16 編碼」。在建立資料庫後無法更改其文字編碼,任何嘗試這樣做的操作都將被忽略。
如果沒有先使用此編碼指令設定編碼,則建立主要資料庫的編碼會預設為由 用於開啟連線的 API 所決定。
一旦設定了資料庫的編碼,就無法更改。
由 ATTACH 命令建立的資料庫一律使用與主要資料庫相同的編碼。嘗試 ATTACH 文字編碼與「主要」資料庫不同的資料庫將會失敗。
PRAGMA schema.foreign_key_check;
PRAGMA schema.foreign_key_check(資料表名稱);
foreign_key_check 編碼指令會檢查資料庫或名為「資料表名稱」的資料表中是否有違反 外鍵約束 的情況。 對於每個外鍵違規,foreign_key_check 編碼指令會傳回一列輸出。每個結果列中有四個欄位。第一個欄位是包含 REFERENCES 子句的資料表名稱。第二個欄位是包含無效 REFERENCES 子句的列的 rowid,如果子資料表是 WITHOUT ROWID 資料表,則為 NULL。第三個欄位是被參考的資料表名稱。第四個欄位是失敗的特定外鍵約束的索引。foreign_key_check 編碼指令輸出中的第四個欄位與 foreign_key_list 編碼指令 輸出中的第一個欄位是相同的整數。當指定「資料表名稱」時,唯一檢查的外鍵約束是 資料表名稱 的 CREATE TABLE 陳述式中 REFERENCES 子句所建立的約束。
PRAGMA foreign_key_list(資料表名稱);
此編碼指令會針對資料表「資料表名稱」的 CREATE TABLE 陳述式中 REFERENCES 子句建立的每個 外鍵約束 傳回一列。
PRAGMA foreign_keys;
PRAGMA foreign_keys = 布林值;
查詢、設定或清除 外鍵約束 的強制執行。
此編碼指令在交易中無效;外鍵約束強制執行只能在沒有待處理的 BEGIN 或 SAVEPOINT 時啟用或停用。
更改 foreign_keys 設定會影響使用資料庫連線準備的所有語句的執行,包括在更改設定之前準備的語句。使用舊版 sqlite3_prepare() 介面準備的任何現有語句在更改 foreign_keys 設定後可能會因 SQLITE_SCHEMA 錯誤而失敗。
從 SQLite 3.6.19 版開始,外鍵強制執行的預設設定為關閉。然而,這可能會在未來的 SQLite 版本中更改。可以使用 SQLITE_DEFAULT_FOREIGN_KEYS 預處理器巨集在編譯時指定外鍵強制執行的預設設定。為了盡量減少未來的問題,應用程式應根據應用程式的需要設定外鍵強制執行標記,而不是依賴預設設定。
PRAGMA schema.freelist_count;
返回資料庫檔案中未使用的頁面數。
PRAGMA full_column_names;
PRAGMA full_column_names = boolean;
查詢或更改 full_column_names 標記。此標記與 short_column_names 標記一起決定 SQLite 為 SELECT 語句的結果欄位命名的方式。結果欄位名稱是透過依序應用以下規則來命名的
如果結果中有 AS 子句,則欄位名稱為 AS 子句的右側。
如果結果是一般運算式,而不僅僅是來源資料表欄位的名稱,則結果的名稱為運算式文字的副本。
如果 short_column_names 指令為 ON,則結果的名稱為來源資料表欄位的名稱,不包含來源資料表名稱前綴:COLUMN。
如果 short_column_names 和 full_column_names 指令都為 OFF,則適用情況 (2)。
結果欄位的名稱為來源資料表和來源欄位名稱的組合:TABLE.COLUMN
這個編譯指示已被棄用,僅為了向後相容性而存在。新的應用程式應避免使用此編譯指示。舊的應用程式應儘早停止使用此編譯指示。當 SQLite 使用 SQLITE_OMIT_DEPRECATED 編譯時,可以從建置中省略此編譯指示。
PRAGMA fullfsync
PRAGMA fullfsync = boolean;
查詢或更改 fullfsync 標記。此標記決定是否在支援 F_FULLFSYNC 同步方法的系統上使用該方法。 fullfsync 標記的預設值為 off。只有 Mac OS X 支援 F_FULLFSYNC。
另請參閱 checkpoint_fullfsync。
PRAGMA function_list;
此指令會返回資料庫連線已知的 SQL 函數清單。結果的每一列描述單個 SQL 函數的單個呼叫簽章。某些 SQL 函數在結果集中將有多個列,如果它們可以(例如)以不同數量的參數呼叫,或者可以接受各種編碼的文字。
PRAGMA hard_heap_limit
PRAGMA hard_heap_limit=N
如果指定了 N 且 N 是小於目前硬堆限制的正整數,則此指令會使用參數 N 呼叫 sqlite3_hard_heap_limit64() 介面。 hard_heap_limit 指令始終返回與 sqlite3_hard_heap_limit64(-1) C 語言函數返回的整數相同的值。也就是說,它始終返回在此 PRAGMA 施加任何更改後設定的硬堆限制值。
此指令只能降低堆限制,而不能提高堆限制。必須使用 C 語言介面 sqlite3_hard_heap_limit64() 來提高堆限制。
另請參閱 soft_heap_limit 指令。
PRAGMA ignore_check_constraints = boolean;
此指令啟用或停用 CHECK 約束的強制執行。預設設定為關閉,表示預設情況下會強制執行 CHECK 約束。
PRAGMA schema.incremental_vacuum(N);
PRAGMA schema.incremental_vacuum;
incremental_vacuum 指令會從可用空間列表 (freelist) 中移除最多 N 頁。資料庫檔案也會縮小相同的量。如果資料庫未處於 auto_vacuum=incremental 模式,或者可用空間列表中沒有任何頁面,則 incremental_vacuum 指令將不起作用。如果可用空間列表中的頁面少於 N 頁,或者 N 小於 1,或者省略了 "(N)" 參數,則會清除整個可用空間列表。
PRAGMA schema.index_info(index-name);
此指令會針對指定索引中的每個鍵值欄位返回一行。鍵值欄位是在 CREATE INDEX 索引語句、UNIQUE 限制 或 PRIMARY KEY 限制 中實際命名的欄位,這些語句或限制用於建立索引。索引項目通常也包含指向被索引表格列的輔助欄位。index_info 指令不會顯示輔助索引欄位,但 index_xinfo 指令 會列出它們。
index_info 指令的輸出欄位如下:
如果沒有名為 index-name 的索引,但存在具有該名稱的 WITHOUT ROWID 表格,則(從 SQLite 3.30.0 版(2019-10-04)開始)此指令會返回 WITHOUT ROWID 表格的主鍵欄位,如同它們在底層 B 樹記錄中的使用方式,也就是說會移除重複的欄位。
PRAGMA schema.index_list(table-name);
此指令會針對與指定表格關聯的每個索引返回一行。
index_list 指令的輸出欄位如下:
PRAGMA schema.index_xinfo(index-name);
此指令會返回索引中每個欄位的資訊。與 index_info 指令 不同,此指令會返回索引中每個欄位的資訊,而不僅是鍵值欄位。(鍵值欄位是在 CREATE INDEX 索引語句、UNIQUE 限制 或 PRIMARY KEY 限制 中實際命名的欄位,這些語句或限制用於建立索引。輔助欄位是用於找到與每個索引項目對應的表格項目的其他欄位。)
index_xinfo 指令的輸出欄位如下:
如果沒有名為 *index-name* 的索引,但有名為該名稱的 WITHOUT ROWID 表格,則(自 2019-10-04 的 SQLite 3.30.0 版 起)此 pragma 會傳回 WITHOUT ROWID 表格的欄位,如同它們在底層 B 樹記錄中的使用方式,也就是說,首先是已去重複的主鍵欄位,然後是資料欄位。
PRAGMA schema.integrity_check;
PRAGMA schema.integrity_check(N)
PRAGMA schema.integrity_check(TABLENAME)
此 pragma 會對資料庫進行低階格式和一致性檢查。integrity_check pragma 會尋找
如果 integrity_check pragma 發現問題,則會傳回字串(以多個資料列顯示,每列一個欄位)來描述這些問題。Pragma integrity_check 在分析停止前最多會傳回 *N* 個錯誤,*N* 預設為 100。如果 pragma integrity_check 沒有發現錯誤,則會傳回一個值為 'ok' 的單列。
通常會檢查整個資料庫檔案。但是,如果引數是 *TABLENAME*,則只會針對指定的表格及其相關索引執行檢查。這稱為「部分完整性檢查」。由於只檢查資料庫的子集,因此無法偵測到檔案中未使用的區段或兩個以上表格重複使用同一個檔案區段等錯誤。只有當 *TABLENAME* 是 sqlite_schema 或其別名之一時,部分完整性檢查才會驗證可用空間列表。支援部分完整性檢查的功能是從 3.33.0 版 (2020-08-14) 開始新增的。
PRAGMA integrity_check 不會發現 FOREIGN KEY 錯誤。請使用 PRAGMA foreign_key_check 命令來尋找 FOREIGN KEY 約束中的錯誤。
另請參閱 PRAGMA quick_check 命令,它會執行 PRAGMA integrity_check 的大部分檢查,但執行速度更快。
PRAGMA schema.journal_mode;
PRAGMA schema.journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF
此 pragma 查詢或設定與目前 資料庫連線 相關聯的資料庫的日誌模式。
此 pragma 的第一種形式會查詢 *database* 的目前日誌模式。如果省略 *database*,則會查詢「主」資料庫。
第二種形式會更改「*database*」的日誌模式,如果省略「*database*」,則會更改所有附加資料庫的日誌模式。系統會傳回新的日誌模式。如果無法更改日誌模式,則會傳回原始日誌模式。
DELETE 日誌模式是正常的行為。在 DELETE 模式中,復原日誌會在每個交易結束時刪除。事實上,刪除操作是導致交易提交的動作。(如需更多詳細資訊,請參閱標題為 SQLite 中的原子提交 的文件。)
TRUNCATE 日誌模式會透過將回滾日誌截斷為零長度而非刪除它來提交事務。在許多系統上,截斷檔案比刪除檔案快得多,因為不需要更改包含的目錄。
PERSIST 日誌模式會防止在每個事務結束時刪除回滾日誌。相反,日誌的標頭會被零覆蓋。這將防止其他資料庫連線回滾日誌。 PERSIST 日誌模式在刪除或截斷檔案比用零覆蓋檔案的第一個區塊昂貴得多的平台上,是一種有效的優化方式。另請參閱:PRAGMA journal_size_limit 和 SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT。
MEMORY 日誌模式將回滾日誌儲存在易失性 RAM 中。這可以節省磁碟 I/O,但會犧牲資料庫的安全性和完整性。如果使用 SQLite 的應用程式在設定 MEMORY 日誌模式期間於事務執行過程中當機,則資料庫檔案很可能會損毀。
WAL 日誌模式使用預寫式日誌而非回滾日誌來實現事務。 WAL 日誌模式是持續性的;設定後,它會在多個資料庫連線以及關閉並重新開啟資料庫後繼續生效。 處於 WAL 日誌模式的資料庫只能由 SQLite 3.7.0 版 (2010-07-21) 或更高版本存取。
OFF 日誌模式會完全停用回滾日誌。永遠不會建立回滾日誌,因此永遠不會有要刪除的回滾日誌。 OFF 日誌模式會停用 SQLite 的原子提交和回滾功能。ROLLBACK 命令將不再有效;它的行為方式未定義。當日誌模式為 OFF 時,應用程式必須避免使用 ROLLBACK 命令。如果應用程式在設定 OFF 日誌模式期間於事務執行過程中當機,則資料庫檔案很可能會損毀。沒有日誌,語句就無法在發生約束錯誤後回溯部分完成的操作。這也可能使資料庫處於損毀狀態。例如,如果重複的項目導致 CREATE UNIQUE INDEX 語句執行到一半失敗,它將會留下部分建立的索引,因此是損毀的索引。由於 OFF 日誌模式允許使用一般 SQL 損毀資料庫檔案,因此在啟用 SQLITE_DBCONFIG_DEFENSIVE 時會停用它。
請注意,記憶體資料庫的 journal_mode 為 MEMORY 或 OFF,且無法更改為其他值。嘗試將記憶體資料庫的 journal_mode 更改為 MEMORY 或 OFF 以外的任何設定都會被忽略。另請注意,在事務作用中時無法更改 journal_mode。
PRAGMA schema.journal_size_limit
PRAGMA schema.journal_size_limit = N ;
如果資料庫連線以獨佔鎖定模式或持續性日誌模式 (PRAGMA journal_mode=persist) 運作,則在提交事務後,回滾日誌檔案可能會保留在檔案系統中。這可以提高後續事務的效能,因為覆寫現有檔案比附加到檔案更快,但它也會消耗檔案系統空間。在大型事務(例如 VACUUM)之後,回滾日誌檔案可能會消耗非常大量的空間。
同樣,在WAL 模式下,預寫式日誌檔案在檢查點之後不會被截斷。相反地,SQLite 會將現有檔案重新用於後續的 WAL 項目,因為覆寫比附加更快。
journal_size_limit 雜湊指令可用於限制交易或檢查點後留在檔案系統中的回滾日誌和 WAL 檔案的大小。每次提交交易或重置 WAL 檔案時,SQLite 會將留在檔案系統中的回滾日誌檔案或 WAL 檔案的大小與此雜湊指令設定的大小限制進行比較,如果日誌或 WAL 檔案較大,則會將其截斷至限制大小。
上面列出的第二種雜湊指令形式用於為指定的資料庫設定新的位元組限制。負數表示沒有限制。要始終將回滾日誌和 WAL 檔案截斷到其最小大小,請將 journal_size_limit 設定為零。上面列出的第一種和第二種雜湊指令形式都會返回單個結果列,其中包含單個整數欄位 - 以位元組為單位的日誌大小限制值。預設的日誌大小限制為 -1(無限制)。SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT 預處理器巨集可用於在編譯時更改預設日誌大小限制。
此雜湊指令僅對雜湊指令名稱前指定的單個資料庫(或未指定資料庫時對「主」資料庫)進行操作。無法使用單個 PRAGMA 陳述式更改所有附加資料庫的日誌大小限制。必須為每個附加的資料庫單獨設定大小限制。
PRAGMA legacy_alter_table;
PRAGMA legacy_alter_table = boolean
此雜湊指令設定或查詢 legacy_alter_table 旗標的值。當此旗標開啟時,ALTER TABLE RENAME 命令(用於更改表格名稱)的工作方式與在 SQLite 3.24.0 (2018-06-04) 和更早版本中的工作方式相同。更具體地說,當此旗標開啟時,ALTER TABLE RENAME 命令僅重寫其 CREATE TABLE 陳述式以及任何相關的 CREATE INDEX 和 CREATE TRIGGER 陳述式中表格名稱的首次出現。對表格的其他引用不會被修改,包括
提供此雜湊指令是為了因應舊程式中包含期望 SQLite 舊版本中 ALTER TABLE RENAME 的不完整行為的程式碼。新的應用程式應將此旗標保持關閉狀態。
為了與舊的 虛擬表格 實作相容,在執行 sqlite3_module.xRename 方法時,會暫時開啟此旗標。sqlite3_module.xRename 方法完成後,會恢復此旗標的值。
也可以使用 SQLITE_DBCONFIG_LEGACY_ALTER_TABLE 選項搭配 sqlite3_db_config() C 語言介面來開啟和關閉舊版表格更改行為。
舊版表格更改行為是每個連線的設定。開啟或關閉此功能會影響 資料庫連線 內所有附加的資料庫檔案。設定不會持續存在。更改一個連線中的此設定不會影響任何其他連線。
PRAGMA legacy_file_format;
此雜湊指令已不再起作用。它已成為無效操作。PRAGMA legacy_file_format 先前提供的功能現在可以使用 SQLITE_DBCONFIG_LEGACY_FILE_FORMAT 選項搭配 sqlite3_db_config() C 語言介面來使用。
PRAGMA schema.locking_mode;
PRAGMA schema.locking_mode = NORMAL | EXCLUSIVE
這個語法指令設定或查詢資料庫連線的鎖定模式。鎖定模式可以是 NORMAL 或 EXCLUSIVE。
在 NORMAL 鎖定模式下(除非在編譯時使用 SQLITE_DEFAULT_LOCKING_MODE 覆寫,否則為預設值),資料庫連線會在每次讀取或寫入交易結束時解除鎖定資料庫檔案。當鎖定模式設定為 EXCLUSIVE 時,資料庫連線永遠不會釋放檔案鎖定。第一次在 EXCLUSIVE 模式下讀取資料庫時,會取得並持有共用鎖定。第一次寫入資料庫時,會取得並持有獨佔鎖定。
透過 EXCLUSIVE 模式連線取得的資料庫鎖定可以透過關閉資料庫連線,或使用此語法指令將鎖定模式設定回 NORMAL 並存取資料庫檔案(讀取或寫入)來釋放。僅將鎖定模式設定為 NORMAL 是不夠的 - 鎖定直到下次存取資料庫檔案時才會釋放。
將鎖定模式設定為 EXCLUSIVE 有三個原因。
當 locking_mode 語法指令指定特定資料庫時,例如
PRAGMA main.locking_mode=EXCLUSIVE;
則鎖定模式僅適用於指定的資料庫。如果「locking_mode」關鍵字前面沒有資料庫名稱限定詞,則鎖定模式會套用至所有資料庫,包括後續 ATTACH 指令新增的任何新資料庫。
「temp」資料庫(儲存 TEMP 資料表和索引的資料庫)和 記憶體資料庫 一律使用獨佔鎖定模式。temp 和 記憶體資料庫 的鎖定模式無法更改。所有其他資料庫預設使用 normal 鎖定模式,並受此語法指令影響。
如果第一次進入 WAL 日誌模式 時鎖定模式為 EXCLUSIVE,則在退出 WAL 日誌模式之前,無法將鎖定模式更改為 NORMAL。如果第一次進入 WAL 日誌模式時鎖定模式為 NORMAL,則可以隨時在 NORMAL 和 EXCLUSIVE 之間更改鎖定模式,而無需退出 WAL 日誌模式。
PRAGMA schema.max_page_count;
PRAGMA schema.max_page_count = N;
查詢或設定資料庫檔案中的最大頁數。兩種形式的語法指令都會傳回最大頁數。第二種形式嘗試修改最大頁數。最大頁數不能小於目前的資料庫大小。
PRAGMA schema.mmap_size;
PRAGMA schema.mmap_size=N
查詢或更改單一資料庫上為記憶體映射 I/O 預留的最大位元組數。第一種形式(無參數)查詢目前的限制。第二種形式(帶有數值參數)設定指定資料庫的限制,如果省略選用的資料庫名稱,則設定所有資料庫的限制。在第二種形式中,如果省略資料庫名稱,則設定的限制將成為透過後續 ATTACH 陳述式新增至 資料庫連線 的所有資料庫的預設限制。
引數 N 是使用記憶體映射 I/O 讀取之資料庫檔案的最大位元組數。如果 N 為零,則停用記憶體映射 I/O。如果 N 為負數,則限制將回復為由最近的 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE) 所決定的預設值,或者如果未設定啟動時限制,則回復為由 SQLITE_DEFAULT_MMAP_SIZE 所決定的編譯時預設值。
PRAGMA mmap_size 陳述句永遠不會將用於記憶體映射 I/O 的位址空間數量增加到超過 SQLITE_MAX_MMAP_SIZE 編譯時選項設定的硬性限制,也不會超過 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE) 的第二個引數在啟動時設定的硬性限制。
為避免從正在執行的 SQL 陳述句底下解除映射記憶體,記憶體映射 I/O 區域的大小在使用中時無法更改。因此,如果先前的 mmap_size 不為零且在相同的 資料庫連線 上同時執行其他 SQL 陳述句,則 mmap_size pragma 可能無效。
PRAGMA module_list;
此 pragma 會傳回已向資料庫連線註冊的 虛擬表格 模組清單。
PRAGMA optimize;
PRAGMA optimize(MASK);
PRAGMA schema.optimize;
PRAGMA schema.optimize(MASK);
嘗試最佳化資料庫。前兩種形式會最佳化所有結構描述,而後兩種形式則僅最佳化指定的結構描述。
在大部分應用程式中,如下使用 PRAGMA optimize 將有助於 SQLite 達到最佳查詢效能。
資料庫連線生命週期較短的應用程式應在關閉每個資料庫連線之前執行一次「PRAGMA optimize;」。
使用長生命週期資料庫連線的應用程式應在第一次開啟連線時執行「PRAGMA optimize=0x10002;」,然後定期(可能每天或每小時一次)執行「PRAGMA optimize;」。
所有應用程式都應在結構描述變更後執行「PRAGMA optimize;」,尤其是在一個或多個 CREATE INDEX 陳述句之後。
此 pragma 通常無效或幾乎無效,而且執行速度非常快。在需要對一個或多個表格執行 ANALYZE 的情況下,它會設定一個僅在此 pragma 期間有效的臨時 分析限制,以防止 ANALYZE 執行過長時間。
建議的做法是,資料庫連線生命週期較短的應用程式應在資料庫連線關閉時執行一次「PRAGMA optimize」。使用長生命週期資料庫連線的應用程式應在資料庫連線第一次開啟時執行「PRAGMA optimize=0x10002」,然後定期(可能每天一次)再次執行「PRAGMA optimize」。所有應用程式都應在結構描述變更後,尤其是 CREATE INDEX 之後執行「PRAGMA optimize」。
此 pragma 執行的最佳化細節預計會隨著時間推移而改變和改進。應用程式應預期此 pragma 將在未來版本中執行新的最佳化。
選用的 MASK 引數是要執行的最佳化的位元遮罩。
0x00001 | 除錯模式。實際上不執行任何最佳化,而是針對每個將要執行的最佳化傳回一行文字。預設為關閉。 |
0x00002 | 對可能受益的表格執行 ANALYZE。預設為開啟。 |
0x00010 | 執行 ANALYZE 時,設定臨時 PRAGMA analysis_limit 以防止執行時間過長。預設為開啟。 |
0x10000 | 檢查所有表格的大小,而不僅僅是最近未使用過的表格,查看是否有表格的大小顯著增加或減少,從而可能受益於重新分析。預設為關閉。 |
預設的 MASK 值為 0xfffe。
要查看所有本來會執行的最佳化,但不實際執行它們,請運行「PRAGMA optimize(-1)」。
決定何時執行分析
在目前的實作中,若且唯若以下所有條件皆為真時,才會分析表格
表格何時被分析的規則可能會在未來的版本中更改。未來可能會新增 MASK 值。未來版本的這個 pragma 語法可能會接受字串字面值作為參數,而不是位元遮罩,但為了向後相容,仍會繼續支援位元遮罩參數。
PRAGMA schema.page_count;
返回資料庫檔案中的總頁數。
PRAGMA schema.page_size;
PRAGMA schema.page_size = bytes;
查詢或設定資料庫的頁面大小。頁面大小必須是 512 到 65536 之間(含)的 2 的次方。
建立新的資料庫時,SQLite 會根據平台和檔案系統為資料庫分配頁面大小。多年來,預設頁面大小幾乎都是 1024 位元組,但從 SQLite 3.12.0 版(2016-03-29)開始,預設頁面大小增加到 4096。建議大多數應用程式使用預設頁面大小。
指定新的頁面大小並不會立即更改頁面大小。新的頁面大小會被記住,並用於在第一次建立資料庫時設定頁面大小(如果在發出 page_size pragma 時資料庫尚不存在),或者在下次於同一個資料庫連線上執行 VACUUM 命令且不在 WAL 模式 下時使用。
編譯時期選項 SQLITE_DEFAULT_PAGE_SIZE 可用於更改分配給新資料庫的預設頁面大小。
PRAGMA parser_trace = boolean;
如果 SQLite 是使用 SQLITE_DEBUG 編譯時期選項編譯的,則可以使用 parser_trace pragma 來開啟 SQLite 內部使用的 SQL 解析器的追蹤功能。此功能用於除錯 SQLite 本身。
這個 pragma 語法旨在用於除錯 SQLite 本身。它僅在使用 SQLITE_DEBUG 編譯時期選項時可用。
PRAGMA pragma_list;
這個 pragma 會返回資料庫連線已知的 PRAGMA 命令清單。
PRAGMA query_only;
PRAGMA query_only = boolean;
query_only pragma 在啟用時會防止資料庫檔案上的資料變更。啟用此 pragma 後,任何 CREATE、DELETE、DROP、INSERT 或 UPDATE 的嘗試都會導致 SQLITE_READONLY 錯誤。然而,資料庫並非真正的唯讀。您仍然可以執行 檢查點 或 COMMIT,且 sqlite3_db_readonly() 常式的傳回值不受影響。
PRAGMA schema.quick_check;
PRAGMA schema.quick_check(N)
PRAGMA schema.quick_check(資料表名稱)
此編譯指示與 integrity_check 類似,但不驗證 UNIQUE 限制,也不驗證索引內容是否與資料表內容相符。藉由跳過 UNIQUE 和索引一致性檢查,quick_check 能夠更快地運行。PRAGMA quick_check 的運行時間為 O(N),而 PRAGMA integrity_check 需要 O(NlogN) 的時間,其中 N 是資料庫中資料列的總數。除此之外,這兩個編譯指示是相同的。
PRAGMA read_uncommitted;
PRAGMA read_uncommitted = 布林值;
查詢、設定或清除 READ UNCOMMITTED 隔離級別。SQLite 的預設隔離級別是 SERIALIZABLE。任何行程或執行緒都可以選擇 READ UNCOMMITTED 隔離級別,但除了共用共同頁面和結構描述快取的連線之間外,仍將使用 SERIALIZABLE。快取共用是使用 sqlite3_enable_shared_cache() API 啟用的。快取共用預設為停用。
有關更多資訊,請參閱 SQLite 共用快取模式。
PRAGMA recursive_triggers;
PRAGMA recursive_triggers = 布林值;
查詢、設定或清除遞迴觸發器功能。
更改 recursive_triggers 設定會影響使用資料庫連線準備的所有陳述式的執行,包括在更改設定之前準備的陳述式。在更改 recursive_triggers 設定後,使用舊版 sqlite3_prepare() 介面準備的任何現有陳述式都可能因 SQLITE_SCHEMA 錯誤而失敗。
在 SQLite 3.6.18 版 (2009-09-11) 之前,不支援遞迴觸發器。SQLite 的行為始終如同將此編譯指示設定為 OFF。在 3.6.18 版中新增了對遞迴觸發器的支援,但為了相容性,最初預設為關閉。在未來版本的 SQLite 中,遞迴觸發器可能會預設開啟。
觸發器的遞迴深度有一個由編譯時期選項 SQLITE_MAX_TRIGGER_DEPTH 設定的硬上限,以及由 sqlite3_limit(db,SQLITE_LIMIT_TRIGGER_DEPTH,...) 設定的執行時期限制。
PRAGMA reverse_unordered_selects;
PRAGMA reverse_unordered_selects = 布林值;
啟用後,此 PRAGMA 會導致許多沒有 ORDER BY 子句的 SELECT 陳述式以與通常相反的順序發出結果。這有助於偵錯對結果順序做出無效假設的應用程式。reverse_unordered_selects 編譯指示適用於大多數 SELECT 陳述式,但是查詢規劃器有時可能會選擇不易反轉的演算法,在這種情況下,無論 reverse_unordered_selects 設定為何,輸出都將以相同的順序顯示。
如果 SELECT 省略 ORDER BY 子句,SQLite 不保證結果的順序。即便如此,結果的順序在一次又一次的運行中不會改變,因此許多應用程式錯誤地依賴任意的輸出順序,無論該順序是什麼。然而,有時新版本的 SQLite 會包含最佳化器增強功能,這會導致沒有 ORDER BY 子句的查詢的輸出順序發生變化。發生這種情況時,依賴特定輸出順序的應用程式可能會發生故障。透過在此編譯指示停用和啟用的情況下多次運行應用程式,可以及早識別和修復應用程式對輸出順序做出錯誤假設的情況,從而減少因連結不同版本的 SQLite 而可能引起的問題。
PRAGMA schema.schema_version;
PRAGMA schema.schema_version = 整數 ;
schema_version 編譯指示將取得或設定 資料庫標頭 中偏移量 40 處的結構描述版本整數值。
SQLite 會在結構描述變更時自動遞增結構描述版本。每次執行 SQL 陳述式時,都會檢查結構描述版本,以確保自 SQL 陳述式準備後結構描述沒有變更。透過使用「PRAGMA schema_version=N」來更改 schema_version 的值,破壞此機制可能會導致 SQL 陳述式使用過時的結構描述執行,進而導致錯誤的答案和/或資料庫損毀。讀取 schema_version 一直都是安全的,但更改 schema_version 則可能會造成問題。因此,當資料庫連線啟用防禦模式時,嘗試更改 schema_version 的值會是一個無聲無息的空操作。
警告: 誤用此語法可能會導致資料庫損毀。
就這個語法而言,VACUUM 命令被視為結構描述變更,因為 VACUUM 通常會更改 sqlite_schema 表格中項目的「rootpage」值。
另請參閱 application_id 語法和 user_version 語法。
PRAGMA schema.secure_delete;
PRAGMA schema.secure_delete = boolean|FAST
查詢或更改安全刪除設定。當 secure_delete 啟用時,SQLite 會以零覆寫已刪除的內容。secure_delete 的預設設定取決於SQLITE_SECURE_DELETE編譯時期選項,通常是關閉的。關閉 secure_delete 設定可以透過減少 CPU 週期數和磁碟 I/O 量來提升效能。希望在刪除或更新內容後避免留下鑑識追蹤的應用程式,應該在執行刪除或更新之前啟用 secure_delete 語法,或者在刪除或更新之後執行 VACUUM。
secure_delete 的「fast」(快速)設定(大約於 2017-08-01 新增)是介於「on」(開啟)和「off」(關閉)之間的中間設定。當 secure_delete 設定為「fast」時,SQLite 只會在不增加 I/O 量的情況下以零覆寫已刪除的內容。換句話說,「fast」設定會使用更多 CPU 週期,但不會使用更多 I/O。這會清除B 樹頁面中的所有舊內容,但在可用空間清單頁面上留下鑑識追蹤。
當存在附加的資料庫且語法中未指定資料庫時,所有資料庫的 secure_delete 設定都會被更改。新附加資料庫的 secure_delete 設定是在評估 ATTACH 命令時主資料庫的設定。
當多個資料庫連線共用相同的快取時,更改一個資料庫連線上的 secure_delete 旗標會更改所有資料庫連線上的旗標。
限制: secure_delete 語法只會清除一般表格中已刪除的內容。如果虛擬表格將內容儲存在影子表格中,則從虛擬表格中刪除內容未必會移除影子表格中的鑑識追蹤。尤其是,即使啟用了 secure_delete 語法,與 SQLite 捆綁在一起的 FTS3 和 FTS5 虛擬表格也可能會在其影子表格中留下鑑識追蹤。
PRAGMA short_column_names;
PRAGMA short_column_names = boolean;
查詢或更改 short-column-names 旗標。此旗標會影響 SQLite 命名由 SELECT 陳述式傳回的資料欄位的方式。詳情請參閱 full_column_names 語法。
這個編譯指示已被棄用,僅為了向後相容性而存在。新的應用程式應避免使用此編譯指示。舊的應用程式應儘早停止使用此編譯指示。當 SQLite 使用 SQLITE_OMIT_DEPRECATED 編譯時,可以從建置中省略此編譯指示。
PRAGMA shrink_memory
這個語法會導致呼叫它的資料庫連線透過呼叫 sqlite3_db_release_memory() 釋放盡可能多的記憶體。
PRAGMA soft_heap_limit
PRAGMA soft_heap_limit=N
此編譯指示 (pragma) 會呼叫 sqlite3_soft_heap_limit64() 介面,並以 N 作為參數,如果 N 有指定且為非負整數。 soft_heap_limit 編譯指示永遠會返回與 C 語言函數 sqlite3_soft_heap_limit64(-1) 相同的整數。
另請參閱 hard_heap_limit 編譯指示。
PRAGMA stats;
此編譯指示會返回關於資料表和索引的輔助資訊。返回的資訊在測試期間用於協助驗證查詢規劃器是否正常運作。此編譯指示的格式和意義可能會在不同版本之間有所變更。由於其易變性,此編譯指示的行為和輸出格式刻意未記錄。
此編譯指示的預期用途僅限於 SQLite 的測試和驗證。此編譯指示可能會隨時變更,不建議應用程式使用。
PRAGMA schema.synchronous;
PRAGMA schema.synchronous = 0 | OFF | 1 | NORMAL | 2 | FULL | 3 | EXTRA;
查詢或更改「synchronous」旗標的設定。第一種形式 (查詢) 會以整數形式返回同步設定。第二種形式會更改同步設定。各種同步設定的意義如下:
在 WAL 模式中,當同步模式為 NORMAL (1) 時,每次 檢查點 之前會同步 WAL 檔案,每次完成 檢查點 之後會同步資料庫檔案,並且在檢查點之後重新使用 WAL 檔案時會同步 WAL 檔案標頭,但在大多數交易期間不會進行同步操作。在 WAL 模式中,如果 synchronous=FULL,則每次交易提交後都會額外執行一次 WAL 檔案的同步操作。每次交易後額外的 WAL 同步有助於確保交易在斷電時仍具有持久性。不論是否有 synchronous=FULL 提供的額外同步,交易都保持一致性。如果不需要考慮持久性,則在 WAL 模式下通常只需要 synchronous=NORMAL。
TEMP 模式總是 synchronous=OFF,因為 TEMP 的內容是暫時的,預期在斷電後不會保留。嘗試更改 TEMP 的同步設定將會被忽略。
另請參閱 fullfsync 和 checkpoint_fullfsync 指令。
PRAGMA schema.table_info(table-name);
此指令會針對指定表格中的每個一般欄位回傳一列資料。結果集中的欄位包括:「name」(欄位名稱);「type」(資料類型,如果已指定,否則為 '');「notnull」(欄位是否可為 NULL);「dflt_value」(欄位的預設值);以及「pk」(對於不屬於主鍵的欄位為零,或者是在主鍵中欄位的 1 基底索引)。
「cid」欄位不應被理解為超過「在目前結果集中的排名」。
table_info 指令中指定的表格也可以是一個視圖。
此指令不會顯示關於 生成的欄位 或 隱藏欄位 的資訊。使用 PRAGMA table_xinfo 可以取得包含生成和隱藏欄位的更完整欄位列表。
PRAGMA table_list;
PRAGMA schema.table_list;
PRAGMA table_list(table-name);
此指令會回傳關於模式中表格和視圖的資訊,每個表格或視圖佔據輸出的一列。table_list 指令最早出現在 SQLite 版本 3.37.0 (2021-11-27)。在其初始版本中,table_list 指令回傳的欄位包含如下所列。未來版本的 SQLite 可能會新增額外的輸出欄位。
預設行為是顯示所有模式中的所有表格。如果指令前出現 schema. 名稱,則只會顯示該模式中的表格。如果提供了 table-name 參數,則只會回傳關於該表格的資訊。
PRAGMA schema.table_xinfo(table-name);
此語法針對指定表格中的每個欄位回傳一列,包含生成的欄位和隱藏欄位。輸出與PRAGMA table_info的欄位相同,外加一個「hidden」欄位,其值表示正規欄位 (0)、動態或儲存的生成欄位 (2 或 3),或虛擬表格中的隱藏欄位 (1)。此欄位值非零的列即為PRAGMA table_info所省略的列。
PRAGMA temp_store;
PRAGMA temp_store = 0 | DEFAULT | 1 | FILE | 2 | MEMORY;
查詢或更改「temp_store」參數的設定。當 temp_store 為 DEFAULT (0) 時,會使用編譯時期的 C 預處理器巨集 SQLITE_TEMP_STORE 來決定暫存表格和索引的儲存位置。當 temp_store 為 MEMORY (2) 時,暫存表格和索引會如同儲存在純記憶體資料庫中一樣。當 temp_store 為 FILE (1) 時,暫存表格和索引會儲存在檔案中。temp_store_directory 語法可用於指定當設定為 FILE 時存放暫存檔案的目錄。當 temp_store 設定值被更改時,所有現有的暫存表格、索引、觸發器和檢視都會立即被刪除。
程式庫編譯時期的 C 預處理器符號 SQLITE_TEMP_STORE 可能會覆蓋此語法設定。下表總結了 SQLITE_TEMP_STORE 預處理器巨集和 temp_store 語法的互動關係
SQLITE_TEMP_STORE PRAGMA
temp_store用於儲存
TEMP 表格和索引0 任何 檔案 1 0 檔案 1 1 檔案 1 2 記憶體 2 0 記憶體 2 1 檔案 2 2 記憶體 3 任何 記憶體
PRAGMA temp_store_directory;
PRAGMA temp_store_directory = '目錄名稱';
查詢或更改 sqlite3_temp_directory 全域變數的值,許多作業系統介面後端使用此變數來決定儲存 暫存表格和索引的位置。
當 temp_store_directory 設定值被更改時,發出該語法的資料庫連線中所有現有的暫存表格、索引、觸發器和檢視表都會立即被刪除。實際操作上,temp_store_directory 應該在程序的第一個資料庫連線開啟後立即設定。如果在同一個程序中其他資料庫連線開啟的狀態下更改其中一個資料庫連線的 temp_store_directory,則行為未定義,而且可能會有非預期的結果。
更改 temp_store_directory 設定並非執行緒安全的。如果應用程式中的其他執行緒同時正在執行任何 SQLite 介面,切勿更改 temp_store_directory 設定。這樣做會導致未定義的行為。更改 temp_store_directory 設定會寫入 sqlite3_temp_directory 全域變數,而該全域變數並未受到互斥鎖的保護。
值 目錄名稱 應以單引號括起來。要將目錄還原為預設值,請將 目錄名稱 設定為空字串,例如:PRAGMA temp_store_directory = ''。如果找不到 目錄名稱 或無法寫入,則會引發錯誤。
暫存檔案的預設目錄取決於作業系統。某些作業系統介面可能會選擇忽略此變數,並將暫存檔案放置在與此處指定的目錄不同的其他目錄中。從這個意義上來說,此語法僅供參考。
這個編譯指示已被棄用,僅為了向後相容性而存在。新的應用程式應避免使用此編譯指示。舊的應用程式應儘早停止使用此編譯指示。當 SQLite 使用 SQLITE_OMIT_DEPRECATED 編譯時,可以從建置中省略此編譯指示。
PRAGMA threads;
PRAGMA threads = N;
查詢或更改目前資料庫連線的 sqlite3_limit(db,SQLITE_LIMIT_WORKER_THREADS,...) 限制值。此限制設定 預編譯語句 為了協助查詢而允許啟動的輔助執行緒數量的上限。預設限制為 0,除非使用 SQLITE_DEFAULT_WORKER_THREADS 編譯時期選項更改。當限制為零時,表示不會啟動任何輔助執行緒。
此 PRAGMA 是 sqlite3_limit(db,SQLITE_LIMIT_WORKER_THREADS,...) 介面的精簡包裝器。
PRAGMA trusted_schema;
PRAGMA trusted_schema = 布林值;
trusted_schema 設定是一個針對每個連線的布林值,用於決定是否允許檢視、觸發程序或綱要運算式(例如 CHECK 約束、DEFAULT 子句、生成的欄位、運算式索引 和/或 部分索引)執行未經安全審核的 SQL 函式和虛擬表格。此設定也可以使用 sqlite3_db_config(db,SQLITE_DBCONFIG_TRUSTED_SCHEMA,...) C 語言介面來控制。
為了維持向下相容性,此設定預設為開啟。關閉此設定有其優點,而且大多數應用程式在關閉此設定後不會受到影響。因此,建議所有應用程式在開啟每個資料庫連線後立即關閉此設定。
編譯時期選項 -DSQLITE_TRUSTED_SCHEMA=0 會使此設定預設為關閉。
PRAGMA 綱要.user_version;
PRAGMA 綱要.user_version = 整數 ;
user_version pragma 將取得或設定 資料庫標頭 中偏移量 60 處的使用者版本整數值。使用者版本是一個整數,應用程式可以根據需要使用它。SQLite 本身不會使用使用者版本。
另請參閱 application_id pragma 和 schema_version pragma。
PRAGMA vdbe_addoptrace = 布林值;
如果 SQLite 是使用 SQLITE_DEBUG 編譯時期選項編譯的,則可以使用 vdbe_addoptrace pragma 顯示在程式碼產生期間建立的完整 VDBE 操作碼。此功能用於除錯 SQLite 本身。詳情請參閱 VDBE 文件。
這個 pragma 語法旨在用於除錯 SQLite 本身。它僅在使用 SQLITE_DEBUG 編譯時期選項時可用。
PRAGMA vdbe_debug = 布林值;
如果 SQLite 是使用 SQLITE_DEBUG 編譯時期選項編譯的,則 vdbe_debug pragma 是另外三個僅限除錯使用的 pragma 的簡寫:vdbe_addoptrace、vdbe_listing 和 vdbe_trace。此功能用於除錯 SQLite 本身。詳情請參閱 VDBE 文件。
這個 pragma 語法旨在用於除錯 SQLite 本身。它僅在使用 SQLITE_DEBUG 編譯時期選項時可用。
PRAGMA vdbe_listing = 布林值;
如果 SQLite 是使用 SQLITE_DEBUG 編譯時期選項編譯的,則可以使用 vdbe_listing pragma 使虛擬機器操作碼的完整清單在評估每個語句時顯示在標準輸出上。啟用清單後,程式碼的完整內容會在開始執行之前列印出來。語句會在列印清單後正常執行。此功能用於除錯 SQLite 本身。詳情請參閱 VDBE 文件。
這個 pragma 語法旨在用於除錯 SQLite 本身。它僅在使用 SQLITE_DEBUG 編譯時期選項時可用。
PRAGMA vdbe_trace = 布林值;
如果 SQLite 是使用 SQLITE_DEBUG 編譯時期選項編譯的,則可以使用 vdbe_trace pragma 使虛擬機器操作碼在評估時列印在標準輸出上。此功能用於除錯 SQLite。詳情請參閱 VDBE 文件。
這個 pragma 語法旨在用於除錯 SQLite 本身。它僅在使用 SQLITE_DEBUG 編譯時期選項時可用。
PRAGMA wal_autocheckpoint;
PRAGMA wal_autocheckpoint=N;
此指令用於查詢或設定 預寫式日誌 的 自動檢查點 間隔。當 預寫式日誌 啟用時(透過 journal_mode 指令),只要預寫式日誌的長度達到或超過 N 頁,就會自動執行檢查點。將自動檢查點大小設定為零或負值會關閉自動檢查點功能。
此指令是 sqlite3_wal_autocheckpoint() C 介面的包裝器。所有自動檢查點都是 PASSIVE 模式。
預設情況下,自動檢查點功能是啟用的,間隔為 1000 或 SQLITE_DEFAULT_WAL_AUTOCHECKPOINT。
PRAGMA schema.wal_checkpoint;
PRAGMA schema.wal_checkpoint(PASSIVE);
PRAGMA schema.wal_checkpoint(FULL);
PRAGMA schema.wal_checkpoint(RESTART);
PRAGMA schema.wal_checkpoint(TRUNCATE);
如果 預寫式日誌 已啟用(透過 journal_mode 指令),此指令會在資料庫 database 上執行 檢查點 操作,如果省略 database,則會在所有附加的資料庫上執行。如果 預寫式日誌 模式已停用,則此指令為無害的空操作。
呼叫此指令而不帶參數相當於呼叫 sqlite3_wal_checkpoint() C 介面。
呼叫此指令並帶有參數相當於使用對應於參數的 第三個參數 呼叫 sqlite3_wal_checkpoint_v2() C 介面。wal_checkpoint 指令會返回帶有三個整數欄位的單一行。第一個欄位通常為 0,但如果 RESTART、FULL 或 TRUNCATE 檢查點被阻止完成,例如因為其他執行緒或程序正在使用資料庫,則該欄位將為 1。換句話說,如果對 sqlite3_wal_checkpoint_v2() 的等效呼叫會返回 SQLITE_OK,則第一個欄位為 0;如果等效呼叫會返回 SQLITE_BUSY,則第一個欄位為 1。第二個欄位是已寫入預寫式日誌檔的已修改頁面數。第三個欄位是在檢查點結束時已成功移回資料庫檔案的預寫式日誌檔中的頁面數。如果沒有預寫式日誌,例如在此指令在非 WAL 模式 的資料庫連線上呼叫時,第二個和第三個欄位為 -1。
PRAGMA writable_schema = boolean;
PRAGMA writable_schema = RESET
當這個編譯指示設定為開啟,且 SQLITE_DBCONFIG_DEFENSIVE 旗標設定為關閉時,則可以使用一般的 UPDATE、INSERT 和 DELETE 陳述式來更改 sqlite_schema 表格。如果參數是 "RESET",則會停用結構描述寫入(如同 "PRAGMA writable_schema=OFF"),此外,還會重新載入結構描述。警告: 誤用此編譯指示很容易導致 資料庫檔案損毀。
本頁最後修改時間:2024-04-16 16:29:07 UTC