SQLite中的PRAGMA語句攻略

 

原文地址:http://iihero.iteye.com/blog/1189633sql

 

PRAGMA語句是SQLITE數據的SQL擴展,是它獨有的特性,主要用於修改SQLITE庫或者內數據查詢的操做。它採用與SELECT、INSERT等語句同樣的形式來發出請求,但也有幾個重要的不一樣: 
1. 特定的PRAGMA語句可能被移走,新的PRAGMA語句可能在新的版本中添加。所以,後向兼容沒法保證。 
2. 未知的PRAGMA命令不會有錯誤消息出現,它只是簡單的忽略。 
3. 有些PRAGMA只在SQL的編譯階段起做用,而不是執行階段。 這意味着若是使用C語言,sqlite3_prepare(), sqlite3_step(), sqlite3_finalize()這幾個API,pragma命令可能只在prepare()的調用裏運行,而不是在後兩個API當中執行。或者,pragma可能在sqlite3_step()執行的時候運行。到底在哪一個階段執行,取決於pragma從自己,以及是哪一個sqlite的release版本。 
4. pragma命令是sqlite特有的,基本上不可能與其它數據庫保持兼容。 

PRAGMA命令的語法格式以下圖: 


它能夠不帶參數,或者只帶一個參數。這個參數能夠是等號賦值,也能夠用括號括起來。二者效果同樣。不少狀況下,參數值是布爾型,值爲(1,yes,true 或on)或者(0, no, false, off) 
關鍵字參數,可使用引號括起來,e.g. 'yes' [FALSE]。有些pragma命令會使用字符串做爲參數,"0"和"no"表示相同的含義。當查詢某設置的值時,不少狀況下返回的是數值,而不是關鍵字。 

pragma名以前,能夠選帶數據庫的名字。數據庫名是被"attach"(關聯)上的數據庫名字,或者是"main", "temp"來表示主數據庫和臨時數據庫。若是可選的數據庫名被略去,則默認爲"main"數據庫。在有些pragma命令裏,數據庫名沒有意義,則簡單的忽略掉。 

下面咱們看看sqlite到底有些有用的pragma命令: 
auto_vacuum 
automatic_index 
cache_size 
case_sensitive_like 
checkpoint_fullfsync 
collation_list 
compile_options 
count_changes¹ 
database_list 
default_cache_size¹ 
empty_result_callbacks¹ 
encoding 
foreign_key_list 
foreign_keys 
freelist_count 
full_column_names¹ 
fullfsync 
ignore_check_constraints 
incremental_vacuum 
index_info 
index_list 
integrity_check 
journal_mode 
journal_size_limit 
legacy_file_format 
locking_mode 
max_page_count 
page_count 
page_size 
parser_trace² 
quick_check 
read_uncommitted 
recursive_triggers 
reverse_unordered_selects 
schema_version 
secure_delete 
short_column_names¹ 
synchronous 
table_info 
temp_store 
temp_store_directory¹ 
user_version 
vdbe_listing² 
vdbe_trace² 
wal_autocheckpoint 
wal_checkpoint 
writable_schema 
這裏邊有幾個標了右上標爲1的,彷佛已經被obsoleted掉了。標爲2的,只被用於debug,僅當sqlite在預編譯宏SQLITE_DEBUG下build出來,纔有用。 

下面看看這些命令的具體用法: 
1. PRAGMA auto_vacuum; 
   PRAGMA auto_vacuum = 0 或 NONE | 1 或 FULL | 2 或 INCREMENTAL; 
   這裏,0和NONE表示的含義相同。 
   缺省值爲0, 表示禁用auto vacuum. 除非SQLITE_DEFAULT_AUTOVACUUM宏在編譯的時候定義了。數據刪除的時候,數據庫大小不會改變。沒用的數據庫文件頁面會被添加到freelist裏頭,用於未來重用。這時,使用VACUUM命令,能夠重建整個數據庫,以回收無用的磁盤空間。 
   值爲1時,全部的freelist頁會被移動到文件末尾,每次事務提交的時候文件會被截短。注意,自動vacuum只是從文件是截斷freelist頁,並無進行碎片重整等操做,也就是說,它沒有VACUUM命令來得完全。事實上,自動vacuum會讓碎片更多。 
   只有在數據庫存儲某些附加信息的時候,它容許每一個數據庫頁來跟蹤它的引用頁,自動vacuum才用得上。它必須在沒有建立任何表的狀況下啓用。在一個表已經建立了以後,是不能啓用和停用auto-vacuum的。 
   值爲2時,表示增量vacuum,意味着並非在每次提交事務的時候自動vacuum,須要調用一個獨立的incremental_vacuum語句來觸發auto-vacuum。 
   數據庫能夠在1和2兩種vacuum模式下進行切換。可是不能從none到full或incremental間切換。要想切換,要麼數據庫是全新的數據庫(沒有任何表), 或者單獨運行vacuum命令之後。改變自動vacuum模式,首先執行auto_vacuum語句設置新的模式,而後調用VACUUM來重整數據庫。 
   不帶參數的auto_vacuum語句返回當前的auto_vacuum模式值。 

2. PRAGMA automatic_index; 
   PRAGMA automatic_index = boolean; 
   查詢,設置或者清除自動索引的功能。缺省值爲true (1). 

3. PRAGMA cache_size; 
   PRAGMA cache_size = <number of pages>; 
   查詢或者修改打開的數據庫內存裏頭能容納的最多的數據庫頁數。缺省值是2000. 這樣設定只會改變當前會話中的cache size,當數據庫從新打開,又會恢復默認值。你可使用default_cache_size來設定全部會話中的cache size 

4. PRAGMA case_sensitive_like=boolean; 
   默認行爲是忽略ascii字符的大小寫。'a' LIKE 'A'會是true. 當禁用case_sensitive_like時,會用默認的like行爲。當啓用它時,就會區分大小寫。 

5. PRAGMA checkpoint_fullfsync 
   PRAGMA checkpoint_fullfsync=boolean; 
   查詢或設置fullfsync的標誌值。若是設置了該值,則F_FULLFSYNC同步方法會在checkpoint操做時調用,默認值是off。只有Mac OS-X操做系統支持F_FULLFSYNC。另外,若是設定了fullfsync值,那麼F_FULLFSYNC同步方法會在全部sync操做裏使用,也checkpoint_fullfsync標誌徹底無關。 

6. PRAGMA collation_list; 
   返回當前數據庫鏈接定義的全部排序順序。 

7. PRAGMA compile_options; 
   這個要贊,返回編譯SQLITE時使用的全部預編譯宏。固然,以"SQLITE_"打頭的前綴會被忽略。實際上它是經過調用sqlite3_compileoption_get()方法返回的。 

8. PRAGMA count_changes; 
   PRAGMA count_changes=boolean; 
   該命令已經停用. 只是爲了保持後向兼容. 若是不設置此值,INSERT, UPDATE, DELETE語句不會返回多少行改變的數據。 
   事實上,sqlite3_changes()能夠獲取改變的行數。 

9. PRAGMA database_list; 
   返回當前數據庫鏈接關聯的數據庫列表. 

10. PRAGMA default_cache_size; 
    PRAGMA default_cache_size = Number-of-pages; 
    設置缺省的cache sie, 是以頁爲單位。不幸的是,該命令也將被廢棄。 

11. PRAGMA empty_result_callbacks; 
    PRAGMA empty_result_callbacks = boolean; 
    僅做後向兼容用。若是將該標誌值清除,sqlite3_exec()提供的回調函數(返回0或多行數據)將不被觸發。 

12. PRAGMA encoding; 
    PRAGMA encoding = "UTF-8"; 
    PRAGMA encoding = "UTF-16"; 
    PRAGMA encoding = "UTF-16le"; 
    PRAGMA encoding = "UTF-16be"; 
    缺省值是utf-8。若是使用attach命令,則會要求使用與main數據庫相同的字符集編碼,若是新的數據庫編碼與main不一樣,則會失敗。 

13. PRAGMA foreign_key_list(table-name); 
    返回外鍵列表 

14. PRAGMA foreign_keys; 
    PRAGMA foreign_keys = boolean; 
    查詢設置或者清除關於外鍵的限制, 外鍵限制只有在BEGIN或者SAVEPOINT不在PENDING狀態時設置纔有效。 
  改變該設置會影響全部已經準備好的SQL語句的執行。 
    從3.6.19開始,默認的FK強制限制是OFF。也就是說,不會強制外鍵依賴。 

15. PRAGMA freelist_count; 
    返回數據庫文件中未使用頁的數目 

16. PRAGMA full_column_names; 
    PRAGMA full_column_names = boolean; 
    deprecated. 
    1. 若是有AS子句,列名就會用AS後的別名 
    2. 若是結果只是普通的表達式,而不是源表的列名,則採用表達式的文本 
    3. 若是使用了short_column_names開關爲ON,則採用源表列名,而且不帶表名前綴 
    4. 若是兩個開關都設爲OFF,則採用第2個規則。 
    5. 結果列是學有源表源列的組合:TABLE.COLUMN 

17. PRAGMA fullfsync; 
    PRAGMA fullfsync = boolean; 
    缺省值爲OFF,也只有MAC os支持F_FULLFSYNC 

18. PRAGMA ignore_check_constraints = boolean; 
    是否強制check約束,缺省值爲off 

19. PRAGMA incremental_vacuum(N); 
    N頁從freelist中移除。用於設定此參數。每次截短相同的頁數。該命令必須是在auto_vacuum=incremental模式下才有效。若是freelist中的頁數少於N,或者N小於1,或者N被徹底忽略,那麼整個freelist會被清除。 

20. PRAGMA index_info(index-name); 
    獲取具名的index信息。 

21. PRAGMA index_list(table-name); 
    獲取與目標表關聯的索引的的相關信息 

22. PRAGMA integrity_check; 
    PRAGMA integrity_check(integer); 
    執行整個庫的徹底性檢查,會查看錯序的記錄、丟失的頁,毀壞的索引等。 

23. 
PRAGMA journal_mode; 
PRAGMA database.journal_mode; 
PRAGMA journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF 
PRAGMA database.journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF 
用於設置數據庫的journal_mode. DELETE是缺省的行爲。在此模式下,每次事務終止的時候,journal文件會被刪除,它會致使事務提交。 
TRUNCATE模式,經過將回滾journal截短成0,而不是刪除它。大多數情狀況下,它要比DELETE模式速度快(由於不用刪除文件) 
PERSIST模式,每次事務結束時,並不刪除rollback journal,而只是在journal的頭部填充0,這樣會阻止別的數據庫鏈接來rollback. 該模式在某些平臺下,是一種優化,特別是刪除或者truncate一個文件比覆蓋文件的第一塊代價高的時候。 
MEMORY模式,只將rollback日誌存儲到RAM中,節省了磁盤I/O,但帶來的代價是穩定性和完整性上的損失。若是中間crash掉了,數據庫有可能損壞。 
WAL模式,也就是write-ahead log取代rollback journal。該模式是持久化的,跨多個數據爲鏈接,在從新打開數據庫之後,仍然有效。該模式只在3.7.0之後纔有效。 
(通過實驗,發現,它會生成兩個文件:.shm和.wal) 
OFF模式,這樣就沒有事務支持了。  
另外要注意的是,對於memory數據庫,只有兩種模式: MEMORY或者OFF。而且,當前若是有活躍的事務,則不容許改變事務模式。 

24. PRAGMA journal_size_limit 
    PRAGMA journal_size_limit = N ; 
    若是鏈接時,用了"exclusive mode(PRAGMA locking_mode=exclusive)或者(PRAGMA journal_mode=persist), 提交事務之後,journal文件會仍然在文件繫系統當中。這可能會提升了效率,可是也損耗了空間。一個大的事務(如VACUUM),會耗費大量的磁盤空間。 
    該設置會限制journal文件的大小。默認值是-1。 

25. PRAGMA legacy_file_format; 
    PRAGMA legacy_file_format = boolean; 
    若是該值爲ON,則會採用3.0.0文件格式,若是爲off, 則會採用最新的文件格式,可能致使舊版本的sqlite沒法打開該文件。 
    第一次新文件格式的sqlite3數據庫打開時,該值爲off.可是默認值會是on. 

26. PRAGMA locking_mode; 
    PRAGMA locking_mode = NORMAL | EXCLUSIVE 
    缺省值是NORMAL. 數據庫鏈接在每個讀或寫事務終點的時候放掉文件鎖。若是是EXCLUSIVE模式,鏈接永遠不會釋放文件鎖。在此模式下,第一次執行讀操做時,會獲取並持有共享鎖,第一次寫,會獲取並持有排它鎖。
    釋放排它鎖,僅當關閉數據庫鏈接,或者將鎖模式改回爲NORMAL時,再次訪問數據庫文件(讀或寫)纔會放掉。簡單的設置爲NORMAL是不夠的,只有當下次再訪問時纔會釋放排它鎖。 
    有下述三個理由,去設置鎖模式爲EXCLUSIVE 
    1. 應用程序須要阻止其它進程訪問數據庫文件 
    2. 文件系統的系統調用數量減小了,致使些許性能降低 
    3. WAL日誌模式能夠在EXCLUSIVE模式下使用,而不須要用到共享內存 
    當指定數據庫名時,只能目標數據庫生效。如: 
    PRAGMA main.locking_mode=EXCLUSIVE;  不指定數據庫名時,則對全部打開的數據庫生效。temp或者memory數據庫老是使用exclusive鎖模式。 
  第一次進入WAL日誌模式時,鎖模式使用的是exclusive,這之後,鎖模式也不能改變,直到退出WAL日誌模式,若是鎖模式開始時使用的是NORMAL,第一次進入WAL,這時鎖模式能夠改變,而且不須要退出WAL模式。 

27. PRAGMA max_page_count; 
    PRAGMA max_page_count = N; 
    查詢或者設置數據庫文件的最大頁數 

28. PRAGMA page_count; 
    返回數據庫文件的頁數 

29. PRAGMA page_size; 
    PRAGMA page_size = bytes; 
    查詢或者設置數據庫文件的頁大小, 必須是2的乘方,而且介於512和65536之間。 
    建立數據庫時,會給定一個缺省的大小。page_size命令會當即改變頁大小(若是數據庫是空的話,就是說在沒有建立任何表的狀況下)。若是指定了新大小,是在運行VACUUM命令之間,同時數據庫不是在WAL日誌模式下,那麼VACUUM命令會將頁大小調整到新的大小(這時應該沒有是事建立表的限制) 
    SQLITE_DEFAULT_PAGE_SIZE 缺省值是1024,最大的缺省頁大小是8192. windows下,有時候可能缺省頁大小大於1024,取決於GetDiskFreeSpace()來獲取真實的設置扇區大小。 

30. PRAGMA parser_trace = boolean; 
用在DEBUG的時候。 

31. PRAGMA quick_check; 
    PRAGMA quick_check(integer) 
與integrity_check相像,可是略去了對索引內容與表內容匹配的校驗。 

32. PRAGMA read_uncommitted; 
    PRAGMA read_uncommitted = boolean; 
讀未提交開關。缺省的事務隔離級是:可串行化。任何進程或線程均可以設置讀未提交隔離級,可是,SERIALIZABLE仍被使用,除了共享某頁和表模式的緩存的那些鏈接。 

33. PRAGMA recursive_triggers; 
    PRAGMA recursive_triggers = boolean; 
會影響全部的語句執行。3.6.18之前,這個開關是不支持的。缺省值是off. 

34. PRAGMA reverse_unordered_selects; 
PRAGMA reverse_unordered_selects = boolean; 
當開啓此開關時,不帶order by的select語句,會輸出相反順序的結果。 

35. PRAGMA schema_version; 
PRAGMA schema_version = integer ; 
PRAGMA user_version; 
PRAGMA user_version = integer ; 
schema和user version是在數據庫文件頭40,60字節處的32位整數(大端表示)。 
schema版本由sqlite內部維護,當schema改變時,就會增長該值。顯式改變該值很是危險。 
user版本能夠被應用程序使用。 

36. PRAGMA secure_delete; 
PRAGMA database.secure_delete; 
PRAGMA secure_delete = boolean 
PRAGMA database.secure_delete = boolean 
設爲ON時,刪除的內容會用0來覆蓋。缺省值由宏SQLITE_SECURE_DELETE 決定。那就是OFF了。 

37. PRAGMA short_column_names; 
PRAGMA short_column_names = boolean; 
deprecated. 

38. PRAGMA synchronous; 
PRAGMA synchronous = 0 | OFF | 1 | NORMAL | 2 | FULL; 
查詢設置sync標誌值。缺省值是FULL. 

39. PRAGMA table_info(table-name); 
返回表的基本信息 

40. PRAGMA temp_store; 
PRAGMA temp_store = 0 | DEFAULT | 1 | FILE | 2 | MEMORY; 
查詢或設置temp_store參數值。 
SQLITE_TEMP_STORE PRAGMA temp_store Storage used forTEMP tables 
0 any file 
1 0 file 
1 1 file 
1 2 memory 
2 0 memory 
2 1 file 
2 2 memory 
3 any memory 

40. PRAGMA temp_store_directory; 
    PRAGMA temp_store_directory = 'directory-name'; 
設置或改變temp_store的目錄位置. deprecated. 

41. PRAGMA vdbe_listing = boolean; 
    用於DEBUG 

42. PRAGMA vdbe_trace = boolean; 
    用於DEBUG 

43. PRAGMA wal_autocheckpoint; 
PRAGMA wal_autocheckpoint=N; 
設置WAL自動檢查點的間隔(以頁爲單位), 缺省值是1000。 

44. PRAGMA database.wal_checkpoint; 
PRAGMA database.wal_checkpoint(PASSIVE); 
PRAGMA database.wal_checkpoint(FULL); 
PRAGMA database.wal_checkpoint(RESTART); 

45. PRAGMA writable_schema = boolean; 
當設爲ON時,SQLITE_MASTER表能夠執行CUD操做。這樣作很危險!! 

(finished!!!) 


    
數據庫

相關文章
相關標籤/搜索