小毅整理之------SQLITE入門至精通

          Posted on 2009-06-10 20:08 H2O 閱讀(4321) 評(píng)論(1)  編輯  收藏 所屬分類: DataBase

          菜鳥入門
          1。從www.sqlite.org下載SQLite 3.3.4的版本
             為了方便,我把它解壓了,就一個(gè)SQLite3.exe,放入Windows目錄下。
             Cmd 進(jìn)入命令行
             1)
             創(chuàng)建數(shù)據(jù)庫(kù)文件:
             >SQLite3 d:\test.db 回車
             就生成了一個(gè)test.db在d盤。
             這樣同時(shí)也SQLite3掛上了這個(gè)test.db
             2)
             用.help可以看看有什么命令
             >.help 回車即可
             3)可以在這里直接輸入SQL語(yǔ)句創(chuàng)建表格 用;結(jié)束,然后回車就可以看到了
             4)看看有創(chuàng)建了多少表
             >.tables
             5)看表結(jié)構(gòu)
             >.schema 表名
             6)看看目前的數(shù)據(jù)庫(kù)
             >.database
             7)如果要把查詢輸出到文件
             >.output 文件名
             > 查詢語(yǔ)句;
             查詢結(jié)果就輸出到了文件c:\query.txt

             把查詢結(jié)果用屏幕輸出
             >.output stdout

             8)把表結(jié)構(gòu)輸出,同時(shí)索引也會(huì)輸出
               .dump 表名
             9)退出
             >.exit 或者.quit

          2。從http://sqlite.phxsoftware.com/下載Ado.net驅(qū)動(dòng)。
             下載了安裝,在安裝目錄中存在System.Data.SQLite.dll
              我們只需要拷貝這個(gè)文件到引用目錄,并添加引用即可對(duì)SQLite數(shù)據(jù)庫(kù)操作了
             所有的Ado.net對(duì)象都是以SQLite開頭的,比如SQLiteConnection
             連接串只需要如下方式
             Data Source=d:\test.db 或者DataSource=test.db--應(yīng)用在和應(yīng)用程序或者.net能夠自動(dòng)找到的目錄
             剩下的就很簡(jiǎn)單了~~

          3。SQL語(yǔ)法
             由于以前用SQLServer或者ISeries,所以DDL的語(yǔ)法很汗顏
             1)創(chuàng)建一個(gè)單個(gè)Primary Key的table
             CREATE TABLE  [Admin] (
           [UserName] [nvarchar] (20)   PRIMARY KEY NOT NULL ,
           [Password] [nvarchar] (50)   NOT NULL ,
           [Rank] [smallint] NOT NULL ,
           [MailServer] [nvarchar] (50)   NOT NULL ,
           [MailUser] [nvarchar] (50)   NOT NULL ,
           [MailPassword] [nvarchar] (50)   NOT NULL ,
           [Mail] [nvarchar] (50)   NOT NULL
             ) ;
             2)創(chuàng)建一個(gè)多個(gè)Primary Key的table
             CREATE TABLE  [CodeDetail] (
           [CdType] [nvarchar] (10)  NOT NULL ,
           [CdCode] [nvarchar] (20)  NOT NULL ,
           [CdString1] [ntext]   NOT NULL ,
           [CdString2] [ntext]   NOT NULL ,
           [CdString3] [ntext]   NOT NULL,
            PRIMARY KEY (CdType,CdCode)
                  
             ) ;
             3)創(chuàng)建索引
             CREATE  INDEX [IX_Account] ON  [Account]([IsCheck], [UserName]);
            
             還可以視圖等等。
          4.還有很有用的SQL
            Select * from Sqlite_master
            Select datetime('now')
            Select date('now')
            Select time('now')
           

          SQLite內(nèi)建函數(shù)表

          算術(shù)函數(shù)

          abs(X)

          返回給定數(shù)字表達(dá)式的絕對(duì)值。

          max(X,Y[,...])

          返回表達(dá)式的最大值。

          min(X,Y[,...])

          返回表達(dá)式的最小值。

          random(*)

          返回隨機(jī)數(shù)。

          round(X[,Y])

          返回?cái)?shù)字表達(dá)式并四舍五入為指定的長(zhǎng)度或精度。

          字符處理函數(shù)

          length(X)

          返回給定字符串表達(dá)式的字符個(gè)數(shù)。

          lower(X)

          將大寫字符數(shù)據(jù)轉(zhuǎn)換為小寫字符數(shù)據(jù)后返回字符表達(dá)式。

          upper(X)

          返回將小寫字符數(shù)據(jù)轉(zhuǎn)換為大寫的字符表達(dá)式。

          substr(X,Y,Z)

          返回表達(dá)式的一部分。

          randstr()

           

          quote(A)

           

          like(A,B)

          確定給定的字符串是否與指定的模式匹配。

          glob(A,B)

           

          條件判斷函數(shù)

          coalesce(X,Y[,...])

           

          ifnull(X,Y)

           

          nullif(X,Y)

           

          集合函數(shù)

          avg(X)

          返回組中值的平均值。

          count(X)

          返回組中項(xiàng)目的數(shù)量。

          max(X)

          返回組中值的最大值。

          min(X)

          返回組中值的最小值。

          sum(X)

          返回表達(dá)式中所有值的和。

          其他函數(shù)

          typeof(X)

          返回?cái)?shù)據(jù)的類型。

          last_insert_rowid()

          返回最后插入的數(shù)據(jù)的ID。

          sqlite_version(*)

          返回SQLite的版本。

          change_count()

          返回受上一語(yǔ)句影響的行數(shù)。

          last_statement_change_count()

           


          oh,還有就是看到有人說(shuō),好像成批插入的時(shí)候,啟動(dòng)事務(wù),比不啟動(dòng)事務(wù)快n倍
          還有就是盡量使用參數(shù)化的SQL,估計(jì)和商用DB一樣能夠自動(dòng)Prepare.

          ===========

          sqlite可以在shell/dos command底下直接執(zhí)行命令:

          sqlite3 film.db "select * from film;"

          輸出 HTML 表格:

          sqlite3 -html film.db "select * from film;"

          將數(shù)據(jù)庫(kù)「倒出來(lái)」:

          sqlite3 film.db ".dump" > output.sql

          利用輸出的資料,建立一個(gè)一模一樣的數(shù)據(jù)庫(kù)(加上以上指令,就是標(biāo)準(zhǔn)的SQL數(shù)據(jù)庫(kù)備份了):

          sqlite3 film.db < output.sql

          在大量插入資料時(shí),你可能會(huì)需要先打這個(gè)指令:

          begin;

          插入完資料后要記得打這個(gè)指令,資料才會(huì)寫進(jìn)數(shù)據(jù)庫(kù)中:

          commit;

          SQLITE深入------常見問(wèn)題

          如何建立自動(dòng)增長(zhǎng)字段?

          簡(jiǎn)短回答:聲明為 INTEGER PRIMARY KEY 的列將會(huì)自動(dòng)增長(zhǎng)

          長(zhǎng)一點(diǎn)的答案: 如果你聲明表的一列為 INTEGER PRIMARY KEY,那么, 每當(dāng)你在該列上插入一NULL值時(shí), NULL自動(dòng)被轉(zhuǎn)換為一個(gè)比該列中最大值大1的一個(gè)整數(shù),如果表是空的, 將會(huì)是1。 (如果是最大可能的主鍵 9223372036854775807,那個(gè),將鍵值將是隨機(jī)未使用的數(shù)。) 如,有下列表:

          CREATE TABLE t1(
          a INTEGER PRIMARY KEY,
          b INTEGER
          );
          在該表上,下列語(yǔ)句

          INSERT INTO t1 VALUES(NULL,123);
          在邏輯上等價(jià)于:

          INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);
          有一個(gè)新的API叫做 sqlite3_last_insert_rowid(), 它將返回最近插入的整數(shù)值。注意該整數(shù)會(huì)比表中該列上的插入之前的最大值大1。 該鍵值在當(dāng)前的表中是唯一的。但有可能與已從表中刪除的值重疊。 要想建立在整個(gè)表的生命周期中唯一的鍵值,需要在 INTEGER PRIMARY KEY 上增加AUTOINCREMENT聲明。那么,新的鍵值將會(huì)比該表中曾能存在過(guò)的最大值大1。 如果最大可能的整數(shù)值在數(shù)據(jù)表中曾經(jīng)存在過(guò),INSERT將會(huì)失敗, 并返回SQLITE_FULL錯(cuò)誤代碼。

          多個(gè)應(yīng)用程序或一個(gè)應(yīng)用程序的多個(gè)實(shí)例可以同時(shí)訪問(wèn)同一個(gè)數(shù)據(jù)庫(kù)文件嗎?

          多個(gè)進(jìn)程可同時(shí)打開同一個(gè)數(shù)據(jù)庫(kù)。多個(gè)進(jìn)程可以同時(shí)進(jìn)行SELECT 操作,但在任一時(shí)刻,只能有一個(gè)進(jìn)程對(duì)數(shù)據(jù)庫(kù)進(jìn)行更改。

          SQLite使用讀、寫鎖控制對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)。(在Win95/98/ME等不支持讀、 寫鎖的系統(tǒng)下,使用一個(gè)概率性的模擬來(lái)代替。)但使用時(shí)要注意: 如果數(shù)據(jù)庫(kù)文件存放于一個(gè)NFS文件系統(tǒng)上,這種鎖機(jī)制可能不能正常工作。 這是因?yàn)?fcntl() 文件鎖在很多NFS上沒有正確的實(shí)現(xiàn)。 在可能有多個(gè)進(jìn)程同時(shí)訪問(wèn)數(shù)據(jù)庫(kù)的時(shí)候,應(yīng)該避免將數(shù)據(jù)庫(kù)文件放到NFS上。 在Windows上,Microsoft的文檔中說(shuō):如果使用 FAT 文件系統(tǒng)而沒有運(yùn)行 share.exe 守護(hù)進(jìn)程,那么鎖可能是不能正常使用的。那些在Windows上有很多經(jīng)驗(yàn)的人告訴我: 對(duì)于網(wǎng)絡(luò)文件,文件鎖的實(shí)現(xiàn)有好多Bug,是靠不住的。如果他們說(shuō)的是對(duì)的, 那么在兩臺(tái)或多臺(tái)Windows機(jī)器間共享數(shù)據(jù)庫(kù)可能會(huì)引起不期望的問(wèn)題。

          我們意識(shí)到,沒有其它嵌入式的 SQL 數(shù)據(jù)庫(kù)引擎能象 SQLite 這樣處理如此多的并發(fā)。SQLite允許多個(gè)進(jìn)程同時(shí)打開一個(gè)數(shù)據(jù)庫(kù), 同時(shí)讀一個(gè)數(shù)據(jù)庫(kù)。當(dāng)有任何進(jìn)程想要寫時(shí),它必須在更新過(guò)程中鎖住數(shù)據(jù)庫(kù)文件。 但那通常只是幾毫秒的時(shí)間。其它進(jìn)程只需等待寫進(jìn)程干完活結(jié)束。 典型地,其它嵌入式的SQL數(shù)據(jù)庫(kù)引擎同時(shí)只允許一個(gè)進(jìn)程連接到數(shù)據(jù)庫(kù)。

          但是,Client/Server數(shù)據(jù)庫(kù)引擎(如 PostgreSQL, MySQL, 或 Oracle) 通常支持更高級(jí)別的并發(fā),并且允許多個(gè)進(jìn)程同時(shí)寫同一個(gè)數(shù)據(jù)庫(kù)。 這種機(jī)制在Client/Server結(jié)構(gòu)的數(shù)據(jù)庫(kù)上是可能的, 因?yàn)榭偸怯幸粋€(gè)單一的服務(wù)器進(jìn)程很好地控制、協(xié)調(diào)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)。 如果你的應(yīng)用程序需要很多的并發(fā),那么你應(yīng)該考慮使用一個(gè)Client/Server 結(jié)構(gòu)的數(shù)據(jù)庫(kù)。但經(jīng)驗(yàn)表明,很多應(yīng)用程序需要的并發(fā),往往比其設(shè)計(jì)者所想象的少得多。

          當(dāng)SQLite試圖訪問(wèn)一個(gè)被其它進(jìn)程鎖住的文件時(shí),缺省的行為是返回 SQLITE_BUSY。 可以在C代碼中使用 sqlite3_busy_handler() 或 sqlite3_busy_timeout() API 函數(shù)調(diào)整這一行為。

          在SQLite數(shù)據(jù)庫(kù)中如何列出所有的表和索引?

          如果你運(yùn)行 sqlite3 命令行來(lái)訪問(wèn)你的數(shù)據(jù)庫(kù),可以鍵入 “.tables”來(lái)獲得所有表的列表?;蛘?,你可以輸入 “.schema” 來(lái)看整個(gè)數(shù)據(jù)庫(kù)模式,包括所有的表的索引。 輸入這些命令,后面跟一個(gè)LIKE模式匹配可以限制顯示的表。

          在一個(gè) C/C++ 程序中(或者腳本語(yǔ)言使用 Tcl/Ruby/Perl/Python 等) 你可以在一個(gè)特殊的名叫 SQLITE_MASTER 上執(zhí)行一個(gè)SELECT查詢以獲得所有 表的索引。每一個(gè) SQLite 數(shù)據(jù)庫(kù)都有一個(gè)叫 SQLITE_MASTER 的表, 它定義數(shù)據(jù)庫(kù)的模式。 SQLITE_MASTER 表看起來(lái)如下:

          CREATE TABLE sqlite_master (
          type TEXT,
          name TEXT,
          tbl_name TEXT,
          rootpage INTEGER,
          sql TEXT
          );
          對(duì)于表來(lái)說(shuō),type 字段永遠(yuǎn)是 'table',name 字段永遠(yuǎn)是表的名字。所以,要獲得數(shù)據(jù)庫(kù)中所有表的列表, 使用下列SELECT語(yǔ)句:

          SELECT name FROM sqlite_master
          WHERE type='table'
          ORDER BY name;
          對(duì)于索引,type 等于 'index', name 則是索引的名字,tbl_name 是該索引所屬的表的名字。 不管是表還是索引,sql 字段是原先用 CREATE TABLE 或 CREATE INDEX 語(yǔ)句創(chuàng)建它們時(shí)的命令文本。對(duì)于自動(dòng)創(chuàng)建的索引(用來(lái)實(shí)現(xiàn) PRIMARY KEY 或 UNIQUE 約束),sql字段為NULL。

          SQLITE_MASTER 表是只讀的。不能對(duì)它使用 UPDATE、INSERT 或 DELETE。 它會(huì)被 CREATE TABLE、CREATE INDEX、DROP TABLE 和 DROP INDEX 命令自動(dòng)更新。

          臨時(shí)表不會(huì)出現(xiàn)在 SQLITE_MASTER 表中。臨時(shí)表及其索引和觸發(fā)器存放在另外一個(gè)叫 SQLITE_TEMP_MASTER 的表中。SQLITE_TEMP_MASTER 跟 SQLITE_MASTER 差不多, 但它只是對(duì)于創(chuàng)建那些臨時(shí)表的應(yīng)用可見。如果要獲得所有表的列表, 不管是永久的還是臨時(shí)的,可以使用類似下面的命令:

          SELECT name FROM
             (SELECT * FROM sqlite_master UNION ALL
              SELECT * FROM sqlite_temp_master)
          WHERE type='table'
          ORDER BY name

          在SQLite中,VARCHAR字段最長(zhǎng)是多少?

          SQLite 不強(qiáng)制 VARCHAR 的長(zhǎng)度。 你可以在 SQLITE 中聲明一個(gè) VARCHAR(10),SQLite還是可以很高興地允許你放入500個(gè)字符。 并且這500個(gè)字符是原封不動(dòng)的,它永遠(yuǎn)不會(huì)被截?cái)唷?/p>

          SQLite支持二進(jìn)制大對(duì)象嗎?

          SQLite 3.0 及以后版本允許你在任何列中存儲(chǔ) BLOB 數(shù)據(jù)。 即使該列被聲明為其它類型也可以。

          在SQLite中,如何在一個(gè)表上添加或刪除一列?

          SQLite 有有限地 ALTER TABLE 支持。你可以使用它來(lái)在表的末尾增加一列,可更改表的名稱。 如果需要對(duì)表結(jié)構(gòu)做更復(fù)雜的改變,則必須重新建表。 重建時(shí)可以先將已存在的數(shù)據(jù)放到一個(gè)臨時(shí)表中,刪除原表, 創(chuàng)建新表,然后將數(shù)據(jù)從臨時(shí)表中復(fù)制回來(lái)。

          如,假設(shè)有一個(gè) t1 表,其中有 "a", "b", "c" 三列, 如果要?jiǎng)h除列 c ,以下過(guò)程描述如何做:

          BEGIN TRANSACTION;
          CREATE TEMPORARY TABLE t1_backup(a,b);
          INSERT INTO t1_backup SELECT a,b FROM t1;
          DROP TABLE t1;
          CREATE TABLE t1(a,b);
          INSERT INTO t1 SELECT a,b FROM t1_backup;
          DROP TABLE t1_backup;
          COMMIT;

          在數(shù)據(jù)庫(kù)中刪除了很多數(shù)據(jù),但數(shù)據(jù)庫(kù)文件沒有變小,是Bug嗎?

          不是。當(dāng)你從SQLite數(shù)據(jù)庫(kù)中刪除數(shù)據(jù)時(shí), 未用的磁盤空間將會(huì)加入一個(gè)內(nèi)部的“自由列表”中。 當(dāng)你下次插入數(shù)據(jù)時(shí),這部分空間可以重用。磁盤空間不會(huì)丟失, 但也不會(huì)返還給操作系統(tǒng)。

          如果刪除了大量數(shù)據(jù),而又想縮小數(shù)據(jù)庫(kù)文件占用的空間,執(zhí)行 VACUUM 命令。 VACUUM 將會(huì)從頭重新組織數(shù)據(jù)庫(kù)。這將會(huì)使用數(shù)據(jù)庫(kù)有一個(gè)空的“自由鏈表”, 數(shù)據(jù)庫(kù)文件也會(huì)最小。但要注意的是,VACUUM 的執(zhí)行會(huì)需要一些時(shí)間 (在SQLite開發(fā)時(shí),在Linux上,大約每M字節(jié)需要半秒種),并且, 執(zhí)行過(guò)程中需要原數(shù)據(jù)庫(kù)文件至多兩倍的臨時(shí)磁盤空間。

          對(duì)于 SQLite 3.1版本,一個(gè) auto-vacumm 模式可以替代 VACUUM 命令。 可以使用 auto_vacuum pragma 打開。

          SQLITE_SCHEMA error是什么錯(cuò)誤?為什么會(huì)出現(xiàn)該錯(cuò)誤?

          當(dāng)一個(gè)準(zhǔn)備好的(prepared)SQL語(yǔ)句不再有效或者無(wú)法執(zhí)行時(shí), 將返回一個(gè) SQLITE_SCHEMA 錯(cuò)誤。發(fā)生該錯(cuò)誤時(shí),SQL語(yǔ)句必須使用 sqlite3_prepare() API來(lái)重新編譯. 在 SQLite 3 中, 一個(gè) SQLITE_SCHEMA 錯(cuò)誤只會(huì)發(fā)生在用 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 執(zhí)行 SQL 時(shí)。而不會(huì)發(fā)生在使用 sqlite3_exec()時(shí)。 在版本2中不是這樣。

          準(zhǔn)備好的語(yǔ)句失效的最通常原因是:在語(yǔ)句準(zhǔn)備好后, 數(shù)據(jù)庫(kù)的模式又被修改了。另外的原因會(huì)發(fā)生在:

          數(shù)據(jù)庫(kù)離線:DETACHed.
          數(shù)據(jù)庫(kù)被 VACUUMed
          一個(gè)用戶存儲(chǔ)過(guò)程定義被刪除或改變。
          一個(gè) collation 序列定義被刪除或改變。
          認(rèn)證函數(shù)被改變。
          在所有情況下,解決方法是重新編譯并執(zhí)行該SQL語(yǔ)句。 因?yàn)橐粋€(gè)已準(zhǔn)備好的語(yǔ)句可以由于其它進(jìn)程改變數(shù)據(jù)庫(kù)模式而失效, 所有使用 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 的代碼都應(yīng)準(zhǔn)備處理 SQLITE_SCHEMA 錯(cuò)誤。下面給出一個(gè)例子:


              int rc;
              sqlite3_stmt *pStmt;
              char zSql[] = "SELECT .....";

              do {
                /* Compile the statement from SQL. Assume success. */
                sqlite3_prepare(pDb, zSql, -1, &pStmt, 0);

                while( SQLITE_ROW==sqlite3_step(pStmt) ){
                  /* Do something with the row of available data */
                }

                /* Finalize the statement. If an SQLITE_SCHEMA error has
                ** occured, then the above call to sqlite3_step() will have
                ** returned SQLITE_ERROR. sqlite3_finalize() will return
                ** SQLITE_SCHEMA. In this case the loop will execute again.
                */
                rc = sqlite3_finalize(pStmt);
              } while( rc==SQLITE_SCHEMA );

           

          如何在字符串中使用單引號(hào)(')?

          SQL 標(biāo)準(zhǔn)規(guī)定,在字符串中,單引號(hào)需要使用逃逸字符,即在一行中使用兩個(gè)單引號(hào)。在這方面 SQL 用起來(lái)類似 Pascal 語(yǔ)言。 SQLite 尊循標(biāo)準(zhǔn)。如:

              INSERT INTO xyz VALUES('5 O''clock');


          Sqlite中如何返回本地化當(dāng)前時(shí)間?
          在做ClinicOS的時(shí)候遇到一個(gè)問(wèn)題,在保存病歷登記時(shí)間時(shí),我使用了“CURRENT_TIMESTAMP”,但這有個(gè)問(wèn)題,它返回的是UTC Time,這對(duì)我們中國(guó)人沒啥用,一直希望能想辦法將它轉(zhuǎn)為localtime。今天剛好有空,所以去查了查Sqlite的Mail List,果然也有人遇到了這個(gè)問(wèn)題,我從一篇名為《translate time comparison statement》(http://www.mail-archive.com/sqlite-users@sqlite.org/msg12350.html)中看到這樣的回復(fù):

          Mark Wyszomierski wrote:

          You may want

          WHERE julianday(date('now')) - julianday(date(arrival_date)) > 7

          Mark,

          You should still use the 'localtime' modifier on the 'now' value if your timestamps are local time since 'now' always returns UTC times.

          WHERE julianday(date('now', 'localtime')) - julianday(date(arrival_date)) > 7

          嘿嘿,看來(lái)如果想得到一個(gè)符合本機(jī)區(qū)域設(shè)置的當(dāng)前時(shí)間,必須用date函數(shù)來(lái)轉(zhuǎn)換,
          但date只函數(shù)只返回當(dāng)前日期,而我需要的是返回當(dāng)前日期及時(shí)間,所以這里把它換成datetime函數(shù),即:
          datetime(CURRENT_TIMESTAMP,'localtime')

          以下是sqlite下測(cè)試的輸出信息:
          sqlite> select CURRENT_TIMESTAMP;
          2006-06-18 09:23:36
          sqlite> select datetime(CURRENT_TIMESTAMP,'localtime');
          2006-06-18 17:23:44
          sqlite>

          SQLITE分頁(yè)

          剛開始的時(shí)候沒注意語(yǔ)法
          后來(lái)才發(fā)現(xiàn),原來(lái)用SQLite分頁(yè)是世界上最簡(jiǎn)單的。
          如果我要去11-20的Account表的數(shù)據(jù)
          Select * From Account Limit 9 Offset 10;
          以上語(yǔ)句表示從Account表獲取數(shù)據(jù),跳過(guò)10行,取9行

          嗯,我覺得這個(gè)特性足夠讓很多的web中型網(wǎng)站使用這個(gè)了。

          也可以這樣寫 select * from account limit10,9和上面的的效果一樣。
          這種寫法MySQL也支持。

           

          SQLite不同于其他大部分的SQL數(shù)據(jù)庫(kù)引擎,因?yàn)樗氖滓O(shè)計(jì)目標(biāo)就是簡(jiǎn)單化:

          易于管理
          易于使用
          易于嵌入其他大型程序
          易于維護(hù)和配置
          許多人喜歡SQLite因?yàn)樗男∏珊涂焖? 但是這些特性只是它的部分優(yōu)點(diǎn), 使用者還會(huì)發(fā)現(xiàn)SQLite是非常穩(wěn)定的. 出色的穩(wěn)定性源于它的簡(jiǎn)單, 越簡(jiǎn)單就越不容易出錯(cuò). 除了上述的簡(jiǎn)單、小巧和穩(wěn)定性外, 最重要的在于SQLite力爭(zhēng)做到簡(jiǎn)單化.

          簡(jiǎn)單化在一個(gè)數(shù)據(jù)庫(kù)引擎中可以說(shuō)是一個(gè)優(yōu)點(diǎn), 但也可能是個(gè)缺點(diǎn), 主要決定于你想要做什么. 為了達(dá)到簡(jiǎn)單化, SQLite省略了一些人們認(rèn)為比較有用的特性, 例如高并發(fā)性、 嚴(yán)格的存取控制、 豐富的內(nèi)置功能、 存儲(chǔ)過(guò)程、復(fù)雜的SQL語(yǔ)言特性、 XML以及Java的擴(kuò)展, 超大的萬(wàn)億級(jí)別的數(shù)據(jù)測(cè)量等等. 如果你需要使用上述的這些特性并且不介意它們的復(fù)雜性, 那么SQLite也許就不適合你了. SQLite沒有打算作為一個(gè)企業(yè)級(jí)的數(shù)據(jù)庫(kù)引擎, 也并不打算和Oracle或者PostgreSQL競(jìng)爭(zhēng).

          僅憑經(jīng)驗(yàn)來(lái)說(shuō)SQLite適用于以下場(chǎng)合: 當(dāng)你更看中簡(jiǎn)單的管理、使用和維護(hù)數(shù)據(jù)庫(kù), 而不是那些企業(yè)級(jí)數(shù)據(jù)庫(kù)提供的不計(jì)其數(shù)的復(fù)雜功能的時(shí)候,使用SQLite是一個(gè)比較明智的選擇. 事實(shí)也證明, 人們?cè)谠S多情況下已經(jīng)清楚的認(rèn)識(shí)到簡(jiǎn)單就是最好的選擇.

          SQLite最佳試用場(chǎng)合
          網(wǎng)站

          作為數(shù)據(jù)庫(kù)引擎SQLite適用于中小規(guī)模流量的網(wǎng)站(也就是說(shuō), 99.9%的網(wǎng)站). SQLite可以處理多少網(wǎng)站流量在于網(wǎng)站的數(shù)據(jù)庫(kù)有多大的壓力. 通常來(lái)說(shuō), 如果一個(gè)網(wǎng)站的點(diǎn)擊率少于100000次/天的話, SQLite是可以正常運(yùn)行的. 100000次/天是一個(gè)保守的估計(jì), 不是一個(gè)準(zhǔn)確的上限. 事實(shí)證明, 即使是10倍的上述流量的情況下SQLite依然可以正常運(yùn)行.

          嵌入式設(shè)備和應(yīng)用軟件

          因?yàn)镾QLite數(shù)據(jù)庫(kù)幾乎不需要管理, 因此對(duì)于那些無(wú)人值守運(yùn)行或無(wú)人工技術(shù)支持的設(shè)備或服務(wù), SQLite是一個(gè)很好的選擇. SQLite能很好的適用于手機(jī), PDA, 機(jī)頂盒, 以及其他儀器. 作為一個(gè)嵌入式數(shù)據(jù)庫(kù)它也能夠很好的應(yīng)用于客戶端程序.

          應(yīng)用程序文件格式

          SQLite作為桌面應(yīng)用程序的本地磁盤文件格式取得了巨大成功.例如金融分析工具、CAD 包、檔案管理程序等等. 一般的數(shù)據(jù)庫(kù)打開操作需要調(diào)用sqlite3_open()函數(shù),并且標(biāo)記一個(gè)顯式本地事務(wù)的起始點(diǎn)(BEGIN TRANSACTION)來(lái)保證以獨(dú)占的方式得到文件的內(nèi)容. 文件保存將執(zhí)行一個(gè)提交(COMMIT)同時(shí)標(biāo)記另一個(gè)顯式本地事務(wù)起始點(diǎn). 這種事務(wù)處理的作用就是保證對(duì)于應(yīng)用程序數(shù)據(jù)文件的更新是原子的、持久的、獨(dú)立的和一致的.

          數(shù)據(jù)庫(kù)里可以加入一些臨時(shí)的觸發(fā)器,用來(lái)把所有的改變記錄在一張臨時(shí)的取消/重做日志表中. 當(dāng)用戶按下取消/重做按鈕的時(shí)候這些改變將可以被回滾. 應(yīng)用這項(xiàng)技術(shù)實(shí)現(xiàn)一個(gè)無(wú)限級(jí)的取消/重做功能只需要編寫很少的代碼.

          替代某些特別的文件格式

          許多程序使用fopen(), fread(), 或 fwrite()函數(shù)創(chuàng)建和管理一些自定義的文件用來(lái)保存數(shù)據(jù). 使用SQLite替代這些自定義的文件格式將是一種很好的選擇.

          內(nèi)部的或臨時(shí)的數(shù)據(jù)庫(kù)

          對(duì)于那些有大量的數(shù)據(jù)需要用不同的方式篩選分類的程序, 相對(duì)于編寫同樣功能的代碼, 如果你把數(shù)據(jù)讀入一個(gè)內(nèi)存中的SQLite數(shù)據(jù)庫(kù), 然后使用連接查詢和ORDER BY子句按一定的順序和排列提取需要的數(shù)據(jù), 通常會(huì)更簡(jiǎn)單和快速. 按照上述的方法使用內(nèi)嵌的SQLite數(shù)據(jù)庫(kù)將會(huì)使程序更富有靈活性, 因?yàn)樘砑有碌牧谢蛩饕挥弥貙懭魏尾樵冋Z(yǔ)句.

          命令行數(shù)據(jù)集分析工具

          有經(jīng)驗(yàn)的SQL用戶可以使用SQLite命令行程序去分析各種混雜的數(shù)據(jù)集. 原是數(shù)據(jù)可以從CSV(逗號(hào)分隔值文件)文件中導(dǎo)入, 然后被切分產(chǎn)生無(wú)數(shù)的綜合數(shù)據(jù)報(bào)告. 可能得用法包括網(wǎng)站日志分析, 運(yùn)動(dòng)統(tǒng)計(jì)分析, 編輯規(guī)劃標(biāo)準(zhǔn), 分析試驗(yàn)結(jié)果.

          當(dāng)然你也可以用企業(yè)級(jí)的客戶端/服務(wù)器數(shù)據(jù)庫(kù)來(lái)做同樣的事情. 在這種情況下使用SQLite的好處是: SQLite的部署更為簡(jiǎn)單并且結(jié)果數(shù)據(jù)庫(kù)是一個(gè)單獨(dú)的文件, 你可以把它存儲(chǔ)在軟盤或者優(yōu)盤或者直接通過(guò)email發(fā)給同事.

          在Demo或測(cè)試版的時(shí)候作為企業(yè)級(jí)數(shù)據(jù)庫(kù)的替代品

          如果你正在編寫一個(gè)使用企業(yè)級(jí)數(shù)據(jù)庫(kù)引擎的客戶端程序, 使用一個(gè)允許你連接不同SQL數(shù)據(jù)庫(kù)引擎的通用型數(shù)據(jù)庫(kù)后臺(tái)將是很有意義的. 其更大的意義在于將SQLite數(shù)據(jù)庫(kù)引擎靜態(tài)的連接到客戶端程序當(dāng)中,從而內(nèi)嵌SQLite作為混合的數(shù)據(jù)庫(kù)支持. 這樣客戶端程序就可以使用SQLite數(shù)據(jù)庫(kù)文件做獨(dú)立的測(cè)試或者驗(yàn)證.

          本文來(lái)自: (www.91linux.com) 詳細(xì)出處參考:http://www.91linux.com/html/article/database/sqlite/200812/12-14611.html

           

          數(shù)據(jù)庫(kù)教學(xué)

          因?yàn)镾QLite的安裝和使用非常的簡(jiǎn)單(安裝過(guò)程幾乎忽略不計(jì), 只需要拷貝SQLite源代碼或sqlite.exe可執(zhí)行文件到目標(biāo)主機(jī), 然后直接運(yùn)行就可以) 所以它非常適合用來(lái)講解SQL語(yǔ)句. 同學(xué)們可以非常簡(jiǎn)單的創(chuàng)建他們喜歡的數(shù)據(jù)庫(kù), 然后通過(guò)電子郵件發(fā)給老師批注或打分. 對(duì)于那些感興趣怎樣實(shí)現(xiàn)一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)的高層次的學(xué)生, 按照模塊化設(shè)計(jì)且擁有很好的注釋和文檔的SQLite源代碼, 將為他們打下良好的基礎(chǔ). 這并不是說(shuō)SQLite就是如何實(shí)現(xiàn)其他數(shù)據(jù)庫(kù)引擎的精確模型, 但是很適合學(xué)生們了解SQLite是如何快速工作的, 從而掌握其他數(shù)據(jù)庫(kù)系統(tǒng)的設(shè)計(jì)實(shí)現(xiàn)原則.

          試驗(yàn)SQL語(yǔ)言的擴(kuò)展

          SQLite簡(jiǎn)單且模塊化的設(shè)計(jì)使得它可以成為一個(gè)用來(lái)測(cè)試數(shù)據(jù)庫(kù)語(yǔ)言特性或新想法的優(yōu)秀的原型平臺(tái).

          哪些場(chǎng)合適合使用其他的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)
          客戶端/服務(wù)器程序

           

          如果你有許多的客戶端程序要通過(guò)網(wǎng)絡(luò)訪問(wèn)一個(gè)共享的數(shù)據(jù)庫(kù), 你應(yīng)當(dāng)考慮用一個(gè)客戶端/服務(wù)器數(shù)據(jù)庫(kù)來(lái)替代SQLite. SQLite可以通過(guò)網(wǎng)絡(luò)文件系統(tǒng)工作, 但是因?yàn)楹痛蠖鄶?shù)網(wǎng)絡(luò)文件系統(tǒng)都存在延時(shí), 因此執(zhí)行效率不會(huì)很高. 此外大多數(shù)網(wǎng)絡(luò)文件系統(tǒng)在實(shí)現(xiàn)文件邏輯鎖的方面都存在著bug(包括Unix 和windows). 如果文件鎖沒有正常的工作, 就可能出現(xiàn)在同一時(shí)間兩個(gè)或更多的客戶端程序更改同一個(gè)數(shù)據(jù)庫(kù)的同一部分, 從而導(dǎo)致數(shù)據(jù)庫(kù)出錯(cuò). 因?yàn)檫@些問(wèn)題是文件系統(tǒng)執(zhí)行的時(shí)候本質(zhì)上存在的bug, 因此SQLite沒有辦法避免它們.

          好的經(jīng)驗(yàn)告訴我們, 應(yīng)該避免在許多計(jì)算機(jī)需要通過(guò)一個(gè)網(wǎng)絡(luò)文件系統(tǒng)同時(shí)訪問(wèn)同一個(gè)數(shù)據(jù)庫(kù)的情況下使用SQLite.

          高流量網(wǎng)站

          SQLite通常情況下用作一個(gè)網(wǎng)站的后臺(tái)數(shù)據(jù)庫(kù)可以很好的工作. 但是如果你的網(wǎng)站的訪問(wèn)量大到你開始考慮采取分布式的數(shù)據(jù)庫(kù)部署, 那么你應(yīng)當(dāng)毫不猶豫的考慮用一個(gè)企業(yè)級(jí)的客戶端/服務(wù)器數(shù)據(jù)庫(kù)來(lái)替代SQLite.

          超大的數(shù)據(jù)集

          當(dāng)你在SQLite中開始一個(gè)事務(wù)處理的時(shí)候(事務(wù)處理會(huì)在任何寫操作發(fā)生之前產(chǎn)生, 而不是必須要顯示的調(diào)用BEGIN...COMMIT), 數(shù)據(jù)庫(kù)引擎將不得不分配一小塊臟頁(yè)(文件緩沖頁(yè)面)來(lái)幫助它自己管理回滾操作. 每1MB的數(shù)據(jù)庫(kù)文件SQLite需要256字節(jié). 對(duì)于小型的數(shù)據(jù)庫(kù)這些空間不算什么, 但是當(dāng)數(shù)據(jù)庫(kù)增長(zhǎng)到數(shù)十億字節(jié)的時(shí)候, 緩沖頁(yè)面的尺寸就會(huì)相當(dāng)?shù)拇罅? 如果你需要存儲(chǔ)或修改幾十GB的數(shù)據(jù), 你應(yīng)該考慮用其他的數(shù)據(jù)庫(kù)引擎.

          高并發(fā)訪問(wèn)

          SQLite對(duì)于整個(gè)數(shù)據(jù)庫(kù)文件進(jìn)行讀取/寫入鎖定. 這意味著如果任何進(jìn)程讀取了數(shù)據(jù)庫(kù)中的某一部分, 其他所有進(jìn)程都不能再對(duì)該數(shù)據(jù)庫(kù)的任何部分進(jìn)行寫入操作. 同樣的, 如果任何一個(gè)進(jìn)程在對(duì)數(shù)據(jù)庫(kù)進(jìn)行寫入操作, 其他所有進(jìn)程都不能再讀取該數(shù)據(jù)庫(kù)的任何部分. 對(duì)于大多數(shù)情況這不算是什么問(wèn)題. 在這些情況下每個(gè)程序使用數(shù)據(jù)庫(kù)的時(shí)間都很短暫, 并且不會(huì)獨(dú)占, 這樣鎖定至多會(huì)存在十幾毫秒. 但是如果有些程序需要高并發(fā), 那么這些程序就需要尋找其他的解決方案了


          Feedback

          # re: 小毅整理之------SQLITE入門至精通  回復(fù)  更多評(píng)論   

          2010-11-01 08:45 by abettor
          不知道博主有沒有Hibernate鏈接sqlite的經(jīng)驗(yàn)?zāi)?,俺從網(wǎng)上下了個(gè)例子,發(fā)現(xiàn)總是不能靠hibernate自動(dòng)建表呢?

          posts - 0, comments - 21, trackbacks - 0, articles - 101

          Copyright © H2O

          主站蜘蛛池模板: 锦州市| 岑巩县| 侯马市| 汝城县| 南丰县| 阿勒泰市| 车致| 德庆县| 汉沽区| 鄱阳县| 梓潼县| 兴隆县| 阜平县| 乌海市| 高青县| 淄博市| 龙口市| 盘锦市| 酒泉市| 武邑县| 织金县| 长垣县| 保德县| 遵义县| 广德县| 颍上县| 苗栗县| 乐山市| 抚松县| 那曲县| 孙吴县| 彭州市| 卢龙县| 瑞安市| 年辖:市辖区| 千阳县| 张家口市| 文水县| 丰县| 扬州市| 南通市|