Sqlite2009-06-29 22:22:25閱讀5評論0字號:大中小
| sql-statement ::= | INSERT [OR conflict-algorithm] INTO [database-name .] table-name [(column-list)] VALUES(value-list) | INSERT [OR conflict-algorithm] INTO [database-name .] table-name [(column-list)] select-statement |
INSERT語(yǔ)句有兩種基本形式。一種帶有"VALUES"關(guān)鍵字,在已有表中插入一個(gè)新的行。若不定義字段列表,那么值的數目將與表中的字段數目相同。否則值的數目須與字段列表中的字段數目相同。不在字段列表中的字段被賦予缺省值或NULL(當未定義缺省值)。
INSERT的第二種形式從SELECT語(yǔ)句中獲取數據。若未定義字段列表,則從SELECT得到的字段的數目必須與表中的字段數目相同,否則應與定義的字段列表中的字段數目相同。SELECT的每一行結果在表中插入一個(gè)新的條目。SELECT可以是簡(jiǎn)單的或者復合的。如果SELECT語(yǔ)句帶有ORDERBY子句,ORDER BY會(huì )被忽略。
在使用這一命令時(shí),利用可選的ON CONFLICT子句可以定義替代的約束沖突判定算法。更多信息,參見(jiàn) ON CONFLICT 。為了兼容MySQL,可以使用REPLACE代替"INSERT OR REPLACE".
| conflict-clause ::= | ON CONFLICT conflict-algorithm |
| conflict-algorithm ::= | ROLLBACK | ABORT | FAIL | IGNORE | REPLACE |
ON CONFLICT子句不是獨立的SQL命令。這是一條可以出現在許多其他SQL命令中的非標準的子句。由于它并不是標準的SQL語(yǔ)言,這里單獨介紹它。
ONCONFLICT子句的語(yǔ)法在如上的CREATE TABLE命令中示出。對于INSERT和UPDATE,關(guān)鍵詞"ONCONFLICT"由"OR"替代,這樣語(yǔ)法顯得自然。例如,不用寫(xiě)"INSERT ON CONFLICT IGNORE"而是"INSERT ORIGNORE".二者表示相同的意思。
ON CONFLICT子句定義了解決約束沖突的算法。有五個(gè)選擇:ROLLBACK, ABORT, FAIL, IGNORE, 和REPLACE.缺省方案是ABORT.選項含義如下:
當發(fā)生約束沖突,立即ROLLBACK,即結束當前事務(wù)處理,命令中止并返回SQLITE_CONSTRAINT代碼。若當前無(wú)活動(dòng)事務(wù)(除了每一條命令創(chuàng )建的默認事務(wù)以外),則該算法與ABORT相同。
當發(fā)生約束沖突,命令收回已經(jīng)引起的改變并中止返回SQLITE_CONSTRAINT。但由于不執行ROLLBACK,所以前面的命令產(chǎn)生的改變將予以保留。缺省采用這一行為。
當發(fā)生約束沖突,命令中止返回SQLITE_CONSTRAINT。但遇到?jīng)_突之前的所有改變將被保留。例如,若一條UPDATE語(yǔ)句在100行遇到?jīng)_突100th,前99行的改變將被保留,而對100行或以后的改變將不會(huì )發(fā)生。
當發(fā)生約束沖突,發(fā)生沖突的行將不會(huì )被插入或改變。但命令將照常執行。在沖突行之前或之后的行將被正常的插入和改變,且不返回錯誤信息。
當發(fā)生UNIQUE約束沖突,先存在的,導致沖突的行在更改或插入發(fā)生沖突的行之前被刪除。這樣,更改和插入總是被執行。命令照常執行且不返回錯誤信息。當發(fā)生NOT NULL約束沖突,導致沖突的NULL值會(huì )被字段缺省值取代。若字段無(wú)缺省值,執行ABORT算法。
當沖突應對策略為滿(mǎn)足約束而刪除行時(shí),它不會(huì )調用刪除觸發(fā)器。但在新版中這一特性可能被改變。
INSERT或UPDATE的OR子句定義的算法會(huì )覆蓋CREATE TABLE所定義的。ABORT算法將在沒(méi)有定義任何算法時(shí)缺省使用。
PRAGMA命令是用于修改SQlite庫或查詢(xún)SQLite庫內部數據(non-table)的特殊命令。PRAGMA 命令使用與其它SQLite命令(e.g. SELECT, INSERT)相同的接口,但在如下重要方面與其它命令不同:
可用的pragma命令有如下四個(gè)基本類(lèi)型:
| sql-statement ::= | PRAGMA name [= value] | PRAGMA function(arg) |
使用整數值value的pragma也可以使用符號表示,字符串"on", "true",和 "yes" 等同于1,"off", "false",和 "no"等同于0. 這些字符串大小寫(xiě)不敏感且無(wú)須進(jìn)行引用。無(wú)法識別的字符串被當作1且不會(huì )報錯。value返回時(shí)是整數。
PRAGMA auto_vacuum;
PRAGMA auto_vacuum = 0 | 1;
查詢(xún)或設置數據庫的auto-vacuum標記。
正常情況下,當提交一個(gè)從數據庫中刪除數據的事務(wù)時(shí),數據庫文件不改變大小。未使用的文件頁(yè)被標記并在以后的添加操作中 再次使用。這種情況下使用VACUUM命令釋放刪除得到的空間。
當開(kāi)啟auto-vacuum,當提交一個(gè)從數據庫中刪除數據的事務(wù)時(shí),數據庫文件自動(dòng)收縮, (VACUUM命令在auto-vacuum開(kāi)啟的數據庫中不起作用)。數據庫會(huì )在內部存儲一些信息以便支持這一功能,這使得 數據庫文件比不開(kāi)啟該選項時(shí)稍微大一些。
只有在數據庫中未建任何表時(shí)才能改變auto-vacuum標記。試圖在已有表的情況下修改不會(huì )導致報錯。
PRAGMA cache_size;
PRAGMA cache_size = Number-of-pages;
查詢(xún)或修改SQLite一次存儲在內存中的數據庫文件頁(yè)數。每頁(yè)使用約1.5K內存,缺省的緩存大小是2000. 若需要使用改變大量多行的UPDATE或DELETE命令,并且不介意SQLite使用更多的內存的話(huà),可以增大緩存以提高性能。
當使用cache_size pragma改變緩存大小時(shí),改變僅對當前對話(huà)有效,當數據庫關(guān)閉重新打開(kāi)時(shí)緩存大小恢復到缺省大小。 要想永久改變緩存大小,使用default_cache_size pragma.
PRAGMA case_sensitive_like;
PRAGMA case_sensitive_like = 0 | 1;
LIKE運算符的缺省行為是忽略latin1字符的大小寫(xiě)。因此在缺省情況下'a' LIKE 'A'的值為真??梢酝ㄟ^(guò)打開(kāi) case_sensitive_like pragma來(lái)改變這一缺省行為。當啟用case_sensitive_like,'a' LIKE 'A'為假而 'a' LIKE 'a'依然為真。
PRAGMA count_changes;
PRAGMA count_changes = 0 | 1;
查 詢(xún)或更改count-changes標記。正常情況下INSERT, UPDATE和DELETE語(yǔ)句不返回數據。 當開(kāi)啟count-changes,以上語(yǔ)句返回一行含一個(gè)整數值的數據——該語(yǔ)句插入,修改或刪除的行數。 返回的行數不包括由觸發(fā)器產(chǎn)生的插入,修改或刪除等改變的行數。
PRAGMA default_cache_size;
PRAGMA default_cache_size = Number-of-pages;
查詢(xún)或修改SQLite一次存儲在內存中的數據庫文件頁(yè)數。每頁(yè)使用約1.5K內存,它與 cache_sizepragma類(lèi)似,只是它永久性地改變緩存大小。 利用該pragma,你可以設定一次緩存大小,并且每次重新打開(kāi)數據庫時(shí)都繼續使用該值。
PRAGMA default_synchronous;
該語(yǔ)句在2.8版本中可用,但在3.0版中被去掉了。這條pragma很危險且不推薦使用,安全起見(jiàn)在該文檔中不涉及此pragma的用法。
PRAGMA empty_result_callbacks;
PRAGMA empty_result_callbacks = 0 | 1;
查詢(xún)或更改empty-result-callbacks標記。
empty- result-callbacks標記僅僅影響sqlite3_exec API函數。正常情況下,empty-result-callbacks標記清空, 則對返回0行數據的命令不調用sqlite3_exec()的回叫函數,當設置了empty-result-callbacks,則調用回叫 函數一次,置第三個(gè)參數為0 (NULL).這使得使用sqlite3_exec() API的程序即使在一條查詢(xún)不返回數據時(shí)依然檢索字段名。
PRAGMA encoding;
PRAGMA encoding = "UTF-8";
PRAGMA encoding = "UTF-16";
PRAGMA encoding = "UTF-16le";
PRAGMA encoding = "UTF-16be";
在 第一種形式中,若主數據庫已創(chuàng )建,這條pragma返回主數據庫使用得文本編碼格式,為 "UTF-8", "UTF-16le" (little-endian UTF-16 encoding) 或者"UTF-16be" (big-endian UTF-16 encoding)中的一種。 若主數據庫未創(chuàng )建,返回值為當前會(huì )話(huà)創(chuàng )建的主數據庫將要使用的文本編碼格式。
第二種及以后幾種形式只在主數據庫未創(chuàng )建時(shí)有效。這時(shí)該pragma設置當前會(huì )話(huà)創(chuàng )建的主數據庫將要使用的文本編碼格式。 "UTF-16"表示"使用本機字節順序的UTF-16編碼"。若這些形式在主數據庫創(chuàng )建后使用,將被忽略且不產(chǎn)生任何效果。
數據庫的編碼格式設置后不能夠被改變。
ATTACH命令創(chuàng )建的數據庫使用與主數據庫相同的編碼格式。
PRAGMA full_column_names;
PRAGMA full_column_names = 0 | 1;
查詢(xún)或更改the full-column-names標記。該標記影響SQLite命名SELECT語(yǔ)句(當字段表達式為表-字段或通配符"*"時(shí)) 返回的字段名的方式。正常情況下,當SELECT語(yǔ)句將兩個(gè)或多個(gè)表連接時(shí), 這類(lèi)結果字段的返回名為
若short-column-names和full-column-names標記同時(shí)被設置,則使用full-column-names方式。
PRAGMA fullfsync
PRAGMA fullfsync = 0 | 1;
查詢(xún)或更改fullfsync標記。該標記決定是否在支持的系統上使用F_FULLFSYNC同步模式。缺省值為off.截至目前(2006-02-10) 只有Mac OS X 系統支持F_FULLFSYNC.
PRAGMA page_size;
PRAGMA page_size = bytes;
查詢(xún)或設置page-size值。只有在未創(chuàng )建數據庫時(shí)才能設置page-size。頁(yè)面大小必須是2的整數倍且大于等于512小于等于8192。 上限可以通過(guò)在編譯時(shí)修改宏定義SQLITE_MAX_PAGE_SIZE的值來(lái)改變。上限的上限是32768.
PRAGMA read_uncommitted;
PRAGMA read_uncommitted = 0 | 1;
查 詢(xún),設置或清除READ UNCOMMITTED isolation(讀取未授權的分隔符).缺省的SQLite分隔符等級是SERIALIZABLE. 任何線(xiàn)程或進(jìn)程可選用READ UNCOMMITTED isolation,但除了共享公共頁(yè)和schema緩存的連接之間以外的地方也會(huì ) 使用SERIALIZABLE.緩存共享通過(guò) sqlite3_enable_shared_cache() API開(kāi)啟,且只在運行同一線(xiàn)程的連接間有效。缺省情況下緩存共享是關(guān)閉的。
PRAGMA short_column_names;
PRAGMA short_column_names = 0 | 1;
查詢(xún)或更改the short-column-names標記。該標記影響SQLite命名SELECT語(yǔ)句(當字段表達式為表-字段或通配符"*"時(shí)) 返回的字段名的方式。正常情況下,當SELECT語(yǔ)句將兩個(gè)或多個(gè)表連接時(shí), 這類(lèi)結果字段的返回名為
若short-column-names和full-column-names標記同時(shí)被設置,則使用full-column-names方式。
PRAGMA synchronous;
PRAGMA synchronous = FULL; (2)
PRAGMA synchronous = NORMAL; (1)
PRAGMA synchronous = OFF; (0)
查 詢(xún)或更改"synchronous"標記的設定。第一種形式(查詢(xún))返回整數值。 當synchronous設置為FULL (2), SQLite數據庫引擎在緊急時(shí)刻會(huì )暫停以確定數據已經(jīng)寫(xiě)入磁盤(pán)。 這使系統崩潰或電源出問(wèn)題時(shí)能確保數據庫在重起后不會(huì )損壞。FULL synchronous很安全但很慢。 當synchronous設置為NORMAL, SQLite數據庫引擎在大部分緊急時(shí)刻會(huì )暫停,但不像FULL模式下那么頻繁。 NORMAL模式下有很小的幾率(但不是不存在)發(fā)生電源故障導致數據庫損壞的情況。但實(shí)際上,在這種情況 下很可能你的硬盤(pán)已經(jīng)不能使用,或者發(fā)生了其他的不可恢復的硬件錯誤。 設置為synchronous OFF (0)時(shí),SQLite在傳遞數據給系統以后直接繼續而不暫停。若運行SQLite的應用程序崩潰, 數據不會(huì )損傷,但在系統崩潰或寫(xiě)入數據時(shí)意外斷電的情況下數據庫可能會(huì )損壞。另一方面,在synchronous OFF時(shí) 一些操作可能會(huì )快50倍甚至更多。
在SQLite 2中,缺省值為NORMAL.而在3中修改為FULL.
PRAGMA temp_store;
PRAGMA temp_store = DEFAULT; (0)
PRAGMA temp_store = FILE; (1)
PRAGMA temp_store = MEMORY; (2)
查詢(xún)或更改"temp_store"參數的設置。當temp_store設置為DEFAULT (0),使用編譯時(shí)的C預處理宏 TEMP_STORE來(lái)定義儲存臨時(shí)表和臨時(shí)索引的位置。當設置為MEMORY (2)臨時(shí)表和索引存放于內存中。 當設置為FILE (1)則存放于文件中。temp_store_directory pragma 可用于指定存放該文件的目錄。當改變temp_store設置,所有已存在的臨時(shí)表,索引,觸發(fā)器及視圖將被立即刪除。
庫中的編譯時(shí)C預處理標志TEMP_STORE可以覆蓋該pragma設置。下面的表給出TEMP_STORE預處理宏和 temp_store pragma交互作用的總結:
TEMP_STORE PRAGMA
temp_store臨時(shí)表和索引
使用的存儲方式0 any 文件 1 0 文件 1 1 文件 1 2 內存 2 0 內存 2 1 文件 2 2 內存 3 any 內存
PRAGMA temp_store_directory;
PRAGMA temp_store_directory = 'directory-name';
查詢(xún)或更改"temp_store_directory"設置——存儲臨時(shí)表和索引的文件所在的目錄。 僅在當前連接有效,在建立新連接時(shí)重置為缺省值。
當改變了temp_store_directory設置,所有已有的臨時(shí)表,索引,觸發(fā)器,視圖會(huì )被直接刪除。 建議在數據庫一打開(kāi)時(shí)就設置好temp_store_directory.
directory-name需用單引號引起來(lái)。要想恢復缺省目錄,把directory-name設為空字符串。例如 PRAGMA temp_store_directory = ''.若directory-name未找到或不可寫(xiě)會(huì )引發(fā)錯誤。
臨時(shí)文件的缺省目錄與主機的系統有關(guān),使用Unix/Linux/OSX系統的主機,缺省目錄是如下序列之中第一個(gè)可寫(xiě)的 /var/tmp, /usr/tmp, /tmp,current-directory.對于Windows NT,缺省目錄由Windows決定,一般為 C:\Documents and Settings\user-name\Local Settings\Temp\. SQLite創(chuàng )建的臨時(shí)文件在使用完畢時(shí)就被unlink,所以操作系統可以在SQLite進(jìn)程進(jìn)行中自動(dòng)刪除臨時(shí)文件。 于是,正常情況下不能通過(guò)ls 或 dir命令看到臨時(shí)文件。
PRAGMA database_list;
對每個(gè)打開(kāi)的數據庫,使用該數據庫的信息調用一次回叫函數。使用包括附加的數據庫名和索引名在內的參數。第一行用于主數據庫,第二行用于存放臨時(shí)表的臨時(shí)數據庫。
PRAGMA foreign_key_list(table-name);
對于參數表中每個(gè)涉及到字段的外鍵,使用該外鍵的信息調用一次回叫函數。每個(gè)外鍵中的每個(gè)字段都將調用一次回叫函數。
PRAGMA index_info(index-name);
對該索引涉及到的每個(gè)字段,使用字段信息(字段名,字段號)調用一次回叫函數。
PRAGMA index_list(table-name);
對表中的每個(gè)索引,使用索引信息調用回叫函數。參數包括索引名和一個(gè)指示索引是否唯一的標志。
PRAGMA table_info(table-name);
對于表中的每個(gè)字段,使用字段信息(字段名,數據類(lèi)型,可否為空,缺省值)調用回叫函數。
PRAGMA [database.]schema_version;
PRAGMA [database.]schema_version = integer ;
PRAGMA [database.]user_version;
PRAGMA [database.]user_version = integer ;
這兩條pragma分別用于設置schema-version和user-version的值。schema-version 和user-version均為32位有符號整數,存放于數據庫頭中。
schema- version通常只由SQLite內部操作。每當數據庫的schema改變時(shí)(創(chuàng )建或撤消表或索引),SQLite 將這個(gè)值增大。schema版本在每一次query被執行時(shí)被SQLite所使用,以確定編譯SQL query時(shí)內部cache的schema與編譯后的query實(shí)際執行時(shí)數據庫的schema相匹配。使用"PRAGMA schema_version"更改schema-version會(huì )破壞這一機制,有導致程序崩潰或數據庫損壞的潛在危險。請小心使用!
user-version不在SQLite內部使用,任何程序可以用它來(lái)做任何事。
PRAGMA integrity_check;
該命令對整個(gè)數據庫進(jìn)行完整性檢查,查找次序顛倒的記錄,丟失的頁(yè),殘缺的記錄以及損壞的索引。若發(fā)現任何問(wèn)題則返回一形容問(wèn)題所在的字符串,若一切正常返回"ok".
PRAGMA parser_trace = ON; (1)
PRAGMA parser_trace = OFF; (0)
打開(kāi)或關(guān)閉SQLite庫中的SQL語(yǔ)法分析追蹤,用于debug.只有當SQLite不使用NDEBUG宏進(jìn)行編譯時(shí)該pragma才可用。
PRAGMA vdbe_trace = ON; (1)
PRAGMA vdbe_trace = OFF; (0)
打開(kāi)或關(guān)閉SQLite庫中的虛擬數據庫引擎追蹤,用于debug.更多信息,察看 VDBE文檔。
PRAGMA vdbe_listing = ON; (1)
PRAGMA vdbe_listing = OFF; (0)
打開(kāi)或關(guān)閉虛擬機程序列表,當開(kāi)啟列表功能,整個(gè)程序的內容在執行前被打印出來(lái),就像在每條語(yǔ)句之前自動(dòng)執行EXPLAIN. 語(yǔ)句在打印列表之后正常執行。用于debug.更多信息,察看 VDBE文檔。
| sql-statement ::= | REINDEX collation name |
| sql-statement ::= | REINDEX [database-name .] table/index-name |
REINDEX命令用于刪除并從草稿重建索引。當比較順序改變時(shí)該命令顯得很有效。
在第一種形式中,所有附加數據庫中使用該比較順序的索引均被重建。在第二種形式中, [database-name.]table/index-name標識出一個(gè)表,所有關(guān)聯(lián)該表的索引被重建。若標識出索引,則僅僅該索引被刪除并重建。
若不指定database-name而指定表/索引名以及比較順序,只有關(guān)聯(lián)該比較順序的索引被重建。在重建索引時(shí)總是指定database-name可以消除這一歧義。
| sql-statement ::= | REPLACE INTO [database-name .] table-name [( column-list )] VALUES ( value-list ) | REPLACE INTO [database-name .] table-name [( column-list )] select-statement |
REPLACE命令用于替代INSERT的"INSERT OR REPLACE"變體,以更好的兼容MySQL。查看 INSERT命令文檔獲取更多信息。
| sql-statement ::= | SELECT [ALL | DISTINCT] result [FROM table-list] [WHERE expr] [GROUP BY expr-list] [HAVING expr] [compound-op select]* [ORDER BY sort-expr-list] [LIMIT integer [( OFFSET | , ) integer]] |
| result ::= | result-column [, result-column]* |
| result-column ::= | * | table-name . * | expr [ [AS] string ] |
| table-list ::= | table [join-op table join-args]* |
| table ::= | table-name [AS alias] | ( select ) [AS alias] |
| join-op ::= | , | [NATURAL] [LEFT | RIGHT | FULL] [OUTER | INNER | CROSS] JOIN |
| join-args ::= | [ON expr] [USING ( id-list )] |
| sort-expr-list ::= | expr [sort-order] [, expr [sort-order]]* |
| sort-order ::= | [ COLLATE collation-name ] [ ASC | DESC ] |
| compound_op ::= | UNION | UNION ALL | INTERSECT | EXCEPT |
SELECT語(yǔ)句用于查詢(xún)數據庫。一條SELECT命令的返回結果是零或多行每行有固定字段數的數據。字段的數目由在SELECT和FROM之間的表達式列表定義。任意的表達式都可以被用作結果。若表達式是 *則表示所有表的所有字段。若表達式是表的名字后接.*則結果為該表中的所有字段。
DISTINCT關(guān)鍵字的使用會(huì )使返回的結果是原結果的一個(gè)不含相同行的子集。NULL值被認為是相同的。缺省行為是返回所有的行,為清楚起見(jiàn)可以使用關(guān)鍵字ALL。
查詢(xún)對FROM之后定義的一個(gè)或多個(gè)表進(jìn)行。若多個(gè)表用逗號連接,則查詢(xún)針對它們的交叉連接。所有的SQL-92連接語(yǔ)法均可以用于定義連接。圓括號中的副查詢(xún)可能被FROM子句中的任意表名替代。當結果中僅有一行包含表達式列表中的結果的行時(shí),整個(gè)的FROM子句會(huì )被忽略。
WHERE子句可以限定查詢(xún)操作的行數目。
GROUP BY子句將一行或多行結果合成單行輸出。當結果有聚集函數時(shí)這將尤其有用。GROUP BY子句的表達式不須是出現在結果中的表達式。HAVING子句與WHERE相似,只是HAVING用于過(guò)濾分組創(chuàng )建的行。HAVING子句可能包含值,甚至是不出現在結果中的聚集函數。
ORDERBY子句對所得結果根據表達式排序。表達式無(wú)須是簡(jiǎn)單SELECT的結果,但在復合SELECT中每個(gè)表達式必須精確對應一個(gè)結果字段。每個(gè)表達式可能跟隨一個(gè)可選的COLLATE關(guān)鍵字以及用于排序文本的比較函數名稱(chēng)和/或關(guān)鍵字ASC或DESC,用于說(shuō)明排序規則。
LIMIT子句限定行數的最大值。負的LIMIT表示無(wú)上限。后跟可選的OFFSET說(shuō)明跳過(guò)結果集中的前多少行。在一個(gè)復合查詢(xún)中,LIMIT子句只允許出現在最終SELECT語(yǔ)句中。限定對于所有的查詢(xún)均適用,而不僅僅是添加了LIMIT子句的那一行。注意OFFSET關(guān)鍵字用于LIMIT子句中,則限制值是第一個(gè)數字,而偏移量(offset)是第二個(gè)數字。若用逗號替代OFFSET關(guān)鍵字,則偏移量是第一個(gè)數字而限制值是第二個(gè)數字。這是為了加強對遺留的SQL數據庫的兼容而有意造成的矛盾。
復合的SELECT由兩個(gè)或更多簡(jiǎn)單SELECT經(jīng)由UNION, UNION ALL,INTERSECT,EXCEPT中的一個(gè)運算符連接而成。在一個(gè)復合SELECT中,各個(gè)SELECT需指定相同個(gè)數的結果字段。僅允許一個(gè)ORDERBY子句出現在SELECT的末尾。UNION和UNIONALL運算符從左至右將所有SELECT的結果合成一個(gè)大的表。二者的區別在于UNION的所有結果行是不相同的而 UNIONALL允許重復行。INTERSECT運算符取左右兩個(gè)SELECT結果的交。EXCEPT從左邊SELECT的結果中除掉右邊SELECT的結果。三個(gè)或更多SELECT復合時(shí),它們從左至右結合。
聯(lián)系客服