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 通過資料庫級上的獨占性和共享鎖定來實作獨立事務處理。這意味着當多個程序和線程可以在同一時間從同一資料庫讀取資料,但隻有一個可以寫入資料。在某個程序或線程向資料庫執行寫入操作之前,必須獲得獨占鎖定。在發出獨占鎖定後,其他的讀或寫操作将不會再發生。
windows安裝
直接解壓就可以看到一個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;
//select資料分頁用limit就行,很友善
select * from user limit 2,5;
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
這裡需要說明一下,如果不是用 .exit 和 .quit 這兩個指令退出,我們對資料庫的修改有可能丢失。
sqlite>.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設定,所有已存在的臨時表,索引,觸發器及視圖将被立即删除。