天天看點

YII sqlite win資料庫安裝和建立

        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"

YII sqlite win資料庫安裝和建立

2、建立指令:d:\sqlite\sqlite3 <路徑>+資料庫名稱   sqlite "e:\apache2\htdocs\test\protected\runtime\cache-1.1.8.db" 備注:資料庫名優特殊的擴充名  

YII sqlite win資料庫安裝和建立

然後檢視c:\users\caizhimin\有一個school的檔案,建立完以後并選擇此資料庫

2.2 建立表和插入值

我們建立了一個新的資料庫 mydb.db,加入我們想在其中建立一個名為 user 的表,其包含3個列元素。

可以用create table文法指令。

create table語句基本上就是"create table"關鍵字後跟一個新的表名以及括号内的一堆定義和限制。表名可以是字元串或者辨別符。以"sqlite_"開頭的表名是留給sqlite資料庫 引擎使用的。每個字段的定義是字段名後跟字段的資料類型,接着是一個或多個的字段限制。字段的資料類型并不限制字段中可以存放的資料。更多資訊,參見 sqlite的create table文法。

YII sqlite win資料庫安裝和建立

sqlite> create table user(  

...> id integer primary key,  

...> name varchar(32),  

...> time varchar(12)  

...> );  

注意sqlite下除了特殊指令都要以分号 “;” 結尾,否則它将一直等待第一個分号的出現才判斷這條指令結束。

現在我們可以用 schema 指令看看我們剛剛建立的表 。具體作法如下:

YII sqlite win資料庫安裝和建立

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) 插入資料:

YII sqlite win資料庫安裝和建立

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) 查詢資料:

YII sqlite win資料庫安裝和建立

sqlite> select * from user;  

YII sqlite win資料庫安裝和建立

//select資料分頁用limit就行,很友善  

select * from user limit 2,5;  

3) 删除資料:

YII sqlite win資料庫安裝和建立

sqlite> delete from user where id = 1;   

4) 修改資料(更新資料):

YII sqlite win資料庫安裝和建立

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 指令 。

YII sqlite win資料庫安裝和建立

sqlite> .tables  

2.5 退出sqlite3

安全退出有兩個指令:.exit 和 .quit好了,我們已經建立一個名為zieckey.db的資料庫,并在其中建立一個名為 sensordata 的表.

現在我們想退出,那麼可以用到剛剛提到的 .exit 和 .quit 指令。

例如我們可以這樣退出:

YII sqlite win資料庫安裝和建立

sqlite> .exit  

 這裡需要說明一下,如果不是用 .exit 和 .quit 這兩個指令退出,我們對資料庫的修改有可能丢失。

YII sqlite win資料庫安裝和建立

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設定,所有已存在的臨時表,索引,觸發器及視圖将被立即删除。