SQLite 是 D. Richard Hipp 用 C 語言編寫的開源嵌入式資料庫引擎。它是完全獨立的,不具有外部依賴性。它是作為 PHP V4.3 中的一個選項引入的,建構在 PHP V5 中。SQLite 支援多數 SQL92 标準,可以在所有主要的作業系統上運作,并且支援大多數計算機語言。SQLite 還非常健壯。其建立者保守地估計 SQLite 可以處理每天負擔多達 100,00 次點選率的 Web 站點,并且 SQLite 有時候可以處理 10 倍于上述數字的負載。
功能
SQLite 對 SQL92 标準的支援包括索引、限制、觸發和檢視。SQLite 不支援外鍵限制,但支援原子的、一緻的、獨立和持久 (ACID) 的事務(後面會提供有關 ACID 的更多資訊)。
這意味着事務是原子的 ,因為它們要麼完全執行,要麼根本不執行。事務也是一緻的 ,因為在不一緻的狀态中,該資料庫從未被保留。事務還是獨立的 ,是以,如果在同一時間在同一資料庫上有兩個執行操作的事務,那麼這兩個事務是互不幹擾的。而且事務是持久性的 ,是以,該資料庫能夠在崩潰和斷電時幸免于難,不會丢失資料或損壞。
SQLite 通過資料庫級上的獨占性和共享鎖定來實作獨立事務處理。這意味着當多個程序和線程可以在同一時間從同一資料庫讀取資料,但隻有一個可以寫入資料。在某個進 程或線程向資料庫執行寫入操作之前,必須獲得獨占鎖定。在發出獨占鎖定後,其他的讀或寫操作将不會再發生。
SQLite 網站上記錄了完整的 SQLite locking semantics 。
windows安裝
官方網站下載下傳 http://www.sqlite.org/
直接解壓就可以看到一個sqlite3.exe檔案 A command-line shell for accessing and modifying SQLite databases.
一、建立資料庫:
環境:把資料庫解壓在的的d:\sqlite檔案夾下
實驗一:建立資料庫 架設school(以後将都按照這個資料庫來介紹sqlite學習)
1、“開始->運作->cmd"

2、建立指令:d:\sqlite\sqlite3 <路徑>+資料庫名稱 sqlite "E:\Apache2\htdocs\test\protected\runtime\cache-1.1.8.db" 備注:資料庫名優特殊的擴充名
然後檢視c:\users\caizhimin\有一個school的檔案,建立完以後并選擇此資料庫
2.2 建立表和插入值
我們建立了一個新的資料庫 mydb.db,加入我們想在其中建立一個名為 user 的表,其包含3個列元素。
可以用CREATE TABLE文法指令。
CREATE TABLE語句基本上就是"CREATE TABLE"關鍵字後跟一個新的表名以及括号内的一堆定義和限制。表名可以是字元串或者辨別符。以"sqlite_"開頭的表名是留給sqlite資料庫 引擎使用的。每個字段的定義是字段名後跟字段的資料類型,接着是一個或多個的字段限制。字段的資料類型并不限制字段中可以存放的資料。更多資訊,參見 sqlite的CREATE TABLE文法。
sqlite> create table user(
...> id integer primary key,
...> name varchar(32),
...> time VARCHAR(12)
...> );
注意sqlite下除了特殊指令都要以分号 “;” 結尾,否則它将一直等待第一個分号的出現才判斷這條指令結束。
現在我們可以用 schema 指令看看我們剛剛建立的表 。具體作法如下:
sqlite> .schema
CREATE TABLE user(
id integer primary key,
name varchar(32),
time VARCHAR(12)
);
.schema 是用來檢視資料庫中所有的表的定義内容。如果後面跟了具體的表名稱,則顯示該表的内容。
假如我們想想SensorData表中插入具體列元素值,該怎麼辦呢?這裡可以用INSERT語句。
INSERT語句有兩種基本形式。一種帶有"VALUES"關鍵字,在已有表中插入一個新的行。若不定義字段清單,那麼值的數目将與表中的字段數目相同。否則值的數目須與字段清單中的字段數目相同。不在字段清單中的字段被賦予預設值或NULL(當未定義預設值)。
INSERT 的第二種形式從SELECT語句中擷取資料。若未定義字段清單,則從SELECT得到的字段的數目必須與表中的字段數目相同,否則應與定義的字段清單中的 字段數目相同。SELECT的每一行結果在表中插入一個新的條目。SELECT可以是簡單的或者複合的。如果SELECT語句帶有 ORDER BY子句,ORDER BY會被忽略。
這裡我們可以這樣做:
1) 插入資料:
sqlite> INSERT INTO "user" VALUES(1, 'u1', '201001041414');
INSERT INTO "user" VALUES(2, 'u2', '201001041415');
INSERT INTO "user" VALUES(3, 'u2', '201001041415');
INSERT INTO "user" VALUES(4, 'u2', '201001041415');
INSERT INTO "user" VALUES(5, 'u2', '201001041415');
INSERT INTO "user" VALUES(6, 'u2', '201001041415');
INSERT INTO "user" VALUES(7, 'u2', '201001041415');
INSERT INTO "user" VALUES(8, 'u2', '201001041415');
INSERT INTO "user" VALUES(9, 'u2', '201001041415');
2) 查詢資料:
sqlite> select * from user;
3) 删除資料:
sqlite> delete from user where id = 1;
4) 修改資料(更新資料):
sqlite> update user set name = 'u22' where id = 2;
2.3 線上幫助
我們已經知道了sqlite文法最基本的用法。下面可以看看如何獲得聯機幫助。
很簡單,輸入 .help 就行了。注意要help前加上“.”,這與上面說的以分号結尾有點不同,因為help指令被視為特殊指令。
sqlite> .help
這裡看到的指令都帶有“.”開頭,或者說sqlite下,隻有這些指令是需要帶“.”的。我們會經常用到的指令有:
.output FILENAME
.output stdout
.quit
.read FILENAME
.schema 抓出資料庫中所有的表
.dump ?TABLE? ...
.echo ON|OFF
.exit
2.4 檢視目前資料庫下的所有表
當資料庫越來越大時,我們也許并不太記得資料庫中有多少個表了,這時就需要檢視目前資料庫下的有些什麼表。
我們可以用 .tables 指令 。
sqlite> .tables
2.5 退出sqlite3
安全退出有兩個指令:.exit 和 .quit好了,我們已經建立一個名為zieckey.db的資料庫,并在其中建立一個名為 SensorData 的表.
現在我們想退出,那麼可以用到剛剛提到的 .exit 和 .quit 指令。
例如我們可以這樣退出:
sqlite> .exit
sqlite>.quit
這裡需要說明一下,如果不是用 .exit 和 .quit 這兩個指令退出,我們對資料庫的修改有可能丢失。
退出後,檢視E:\Program Files\sqlite>目錄,會發現多出一個mydb.db檔案:
SQLite性能優化:
很多人直接就使用了,并未注意到SQLite也有配置參數,可以對性能進行調整。有時候,産生的結果會有很大影響。
主要通過pragma指令來實作。
比如: 空間釋放、磁盤同步、Cache大小等。
不要打開。前文提高了,Vacuum的效率非常低!
PRAGMA auto_vacuum;
PRAGMA auto_vacuum = 0 | 1;
查詢或設定資料庫的auto-vacuum标記。
正常情況下,當送出一個從資料庫中删除資料的事務時,資料庫檔案不改變大小。未使用的檔案頁被标記并在以後的添加操作中 再次使用。這種情況下使用VACUUM指令釋放删除得到的空間。
當開啟auto-vacuum,當送出一個從資料庫中删除資料的事務時,資料庫檔案自動收縮, (VACUUM指令在auto-vacuum開啟的資料庫中不起作用)。資料庫會在内部存儲一些資訊以便支援這一功能,這使得資料庫檔案比不開啟該選項時稍微大一些。
隻有在資料庫中未建任何表時才能改變auto-vacuum标記。試圖在已有表的情況下修改不會導緻報錯。
建議改為8000
PRAGMA cache_size;
PRAGMA cache_size = Number-of-pages;
查詢或修改SQLite一次存儲在記憶體中的資料庫檔案頁數。每頁使用約1.5K記憶體,預設的緩存大小是2000. 若需要使用改變大量多行的UPDATE或DELETE指令,并且不介意SQLite使用更多的記憶體的話,可以增大緩存以提高性能。
當使用cache_size pragma改變緩存大小時,改變僅對目前對話有效,當資料庫關閉重新打開時緩存大小恢複到預設大小。 要想永久改變緩存大小,使用default_cache_size pragma.
打開。不然搜尋中文字串會出錯。
PRAGMA case_sensitive_like;
PRAGMA case_sensitive_like = 0 | 1;
LIKE 運算符的預設行為是忽略latin1字元的大小寫。是以在預設情況下'a' LIKE 'A'的值為真。可以通過打開 case_sensitive_like pragma來改變這一預設行為。當啟用case_sensitive_like,'a' LIKE 'A'為假而 'a' LIKE 'a'依然為真。
打開。便于調試
PRAGMA count_changes;
PRAGMA count_changes = 0 | 1;
查 詢或更改count-changes标記。正常情況下INSERT, UPDATE和DELETE語句不傳回資料。當開啟count-changes,以上語句傳回一行含一個整數值的資料——該語句插入,修改或删除的行數。 傳回的行數不包括由觸發器産生的插入,修改或删除等改變的行數。
PRAGMA page_size;
PRAGMA page_size = bytes;
查詢或設定page-size值。隻有在未建立資料庫時才能設定page-size。頁面大小必須是2的整數倍且大于等于512小于等于8192。 上限可以通過在編譯時修改宏定義SQLITE_MAX_PAGE_SIZE的值來改變。上限的上限是32768.
如果有定期備份的機制,而且少量資料丢失可接受,用OFF
PRAGMA synchronous;
PRAGMA synchronous = FULL; (2)
PRAGMA synchronous = NORMAL; (1)
PRAGMA synchronous = OFF; (0)
查 詢或更改"synchronous"标記的設定。第一種形式(查詢)傳回整數值。 當synchronous設定為FULL (2), SQLite資料庫引擎在緊急時刻會暫停以确定資料已經寫入磁盤。 這使系統崩潰或電源出問題時能確定資料庫在重起後不會損壞。FULL synchronous很安全但很慢。 當synchronous設定為NORMAL, SQLite資料庫引擎在大部分緊急時刻會暫停,但不像FULL模式下那麼頻繁。 NORMAL模式下有很小的幾率(但不是不存在)發生電源故障導緻資料庫損壞的情況。但實際上,在這種情況下很可能你的硬碟已經不能使用,或者發生了其他 的不可恢複的硬體錯誤。 設定為synchronous OFF (0)時,SQLite在傳遞資料給系統以後直接繼續而不暫停。若運作SQLite的應用程式崩潰,資料不會損傷,但在系統崩潰或寫入資料時意外斷電的情 況下資料庫可能會損壞。另一方面,在synchronous OFF時一些操作可能會快50倍甚至更多。
在SQLite 2中,預設值為NORMAL.而在3中修改為FULL.
使用2,記憶體模式。
PRAGMA temp_store;
PRAGMA temp_store = DEFAULT; (0)
PRAGMA temp_store = FILE; (1)
PRAGMA temp_store = MEMORY; (2)
查 詢或更改"temp_store"參數的設定。當temp_store設定為DEFAULT (0),使用編譯時的C預處理宏 TEMP_STORE來定義儲存臨時表和臨時索引的位置。當設定為MEMORY (2)臨時表和索引存放于記憶體中。 當設定為FILE (1)則存放于檔案中。temp_store_directorypragma 可用于指定存放該檔案的目錄。當改變temp_store設定,所有已存在的臨時表,索引,觸發器及視圖将被立即删除。
轉載于:https://www.cnblogs.com/linzhenjie/archive/2012/11/21/2781765.html