菜鳥入門
1。從www.sqlite.org下載SQLite 3.3.4的版本
為了方便,我把它解壓了,就一個(gè)SQLite3.exe,放入Windows目錄下。
Cmd 進(jìn)入命令行
1)
創(chuàng)建數(shù)據(jù)庫文件:
>SQLite3 d:\test.db 回車
就生成了一個(gè)test.db在d盤。
這樣同時(shí)也SQLite3掛上了這個(gè)test.db
2)
用.help可以看看有什么命令
>.help 回車即可
3)可以在這里直接輸入SQL語句創(chuàng)建表格 用;結(jié)束,然后回車就可以看到了
4)看看有創(chuàng)建了多少表
>.tables
5)看表結(jié)構(gòu)
>.schema 表名
6)看看目前的數(shù)據(jù)庫
>.database
7)如果要把查詢輸出到文件
>.output 文件名
> 查詢語句;
查詢結(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ù)庫操作了
所有的Ado.net對(duì)象都是以SQLite開頭的,比如SQLiteConnection
連接串只需要如下方式
Data Source=d:\test.db 或者DataSource=test.db--應(yīng)用在和應(yīng)用程序或者.net能夠自動(dòng)找到的目錄
剩下的就很簡單了~~
3。SQL語法
由于以前用SQLServer或者ISeries,所以DDL的語法很汗顏
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á)式并四舍五入為指定的長度或精度。
|
字符處理函數(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()
|
返回受上一語句影響的行數(shù)。
|
last_statement_change_count()
|
|
oh,還有就是看到有人說,好像成批插入的時(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ù)庫「倒出來」:
sqlite3 film.db ".dump" > output.sql
利用輸出的資料,建立一個(gè)一模一樣的數(shù)據(jù)庫(加上以上指令,就是標(biāo)準(zhǔn)的SQL數(shù)據(jù)庫備份了):
sqlite3 film.db < output.sql
在大量插入資料時(shí),你可能會(huì)需要先打這個(gè)指令:
begin;
插入完資料后要記得打這個(gè)指令,資料才會(huì)寫進(jìn)數(shù)據(jù)庫中:
commit;
SQLITE深入------常見問題
如何建立自動(dòng)增長字段?
簡短回答:聲明為 INTEGER PRIMARY KEY 的列將會(huì)自動(dò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
);
在該表上,下列語句
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ì)比該表中曾能存在過的最大值大1。 如果最大可能的整數(shù)值在數(shù)據(jù)表中曾經(jīng)存在過,INSERT將會(huì)失敗, 并返回SQLITE_FULL錯(cuò)誤代碼。
多個(gè)應(yīng)用程序或一個(gè)應(yīng)用程序的多個(gè)實(shí)例可以同時(shí)訪問同一個(gè)數(shù)據(jù)庫文件嗎?
多個(gè)進(jìn)程可同時(shí)打開同一個(gè)數(shù)據(jù)庫。多個(gè)進(jìn)程可以同時(shí)進(jìn)行SELECT 操作,但在任一時(shí)刻,只能有一個(gè)進(jìn)程對(duì)數(shù)據(jù)庫進(jìn)行更改。
SQLite使用讀、寫鎖控制對(duì)數(shù)據(jù)庫的訪問。(在Win95/98/ME等不支持讀、 寫鎖的系統(tǒng)下,使用一個(gè)概率性的模擬來代替。)但使用時(shí)要注意: 如果數(shù)據(jù)庫文件存放于一個(gè)NFS文件系統(tǒng)上,這種鎖機(jī)制可能不能正常工作。 這是因?yàn)?fcntl() 文件鎖在很多NFS上沒有正確的實(shí)現(xiàn)。 在可能有多個(gè)進(jìn)程同時(shí)訪問數(shù)據(jù)庫的時(shí)候,應(yīng)該避免將數(shù)據(jù)庫文件放到NFS上。 在Windows上,Microsoft的文檔中說:如果使用 FAT 文件系統(tǒng)而沒有運(yùn)行 share.exe 守護(hù)進(jìn)程,那么鎖可能是不能正常使用的。那些在Windows上有很多經(jīng)驗(yàn)的人告訴我: 對(duì)于網(wǎng)絡(luò)文件,文件鎖的實(shí)現(xiàn)有好多Bug,是靠不住的。如果他們說的是對(duì)的, 那么在兩臺(tái)或多臺(tái)Windows機(jī)器間共享數(shù)據(jù)庫可能會(huì)引起不期望的問題。
我們意識(shí)到,沒有其它嵌入式的 SQL 數(shù)據(jù)庫引擎能象 SQLite 這樣處理如此多的并發(fā)。SQLite允許多個(gè)進(jìn)程同時(shí)打開一個(gè)數(shù)據(jù)庫, 同時(shí)讀一個(gè)數(shù)據(jù)庫。當(dāng)有任何進(jìn)程想要寫時(shí),它必須在更新過程中鎖住數(shù)據(jù)庫文件。 但那通常只是幾毫秒的時(shí)間。其它進(jìn)程只需等待寫進(jìn)程干完活結(jié)束。 典型地,其它嵌入式的SQL數(shù)據(jù)庫引擎同時(shí)只允許一個(gè)進(jìn)程連接到數(shù)據(jù)庫。
但是,Client/Server數(shù)據(jù)庫引擎(如 PostgreSQL, MySQL, 或 Oracle) 通常支持更高級(jí)別的并發(fā),并且允許多個(gè)進(jìn)程同時(shí)寫同一個(gè)數(shù)據(jù)庫。 這種機(jī)制在Client/Server結(jié)構(gòu)的數(shù)據(jù)庫上是可能的, 因?yàn)榭偸怯幸粋€(gè)單一的服務(wù)器進(jìn)程很好地控制、協(xié)調(diào)對(duì)數(shù)據(jù)庫的訪問。 如果你的應(yīng)用程序需要很多的并發(fā),那么你應(yīng)該考慮使用一個(gè)Client/Server 結(jié)構(gòu)的數(shù)據(jù)庫。但經(jīng)驗(yàn)表明,很多應(yīng)用程序需要的并發(fā),往往比其設(shè)計(jì)者所想象的少得多。
當(dāng)SQLite試圖訪問一個(gè)被其它進(jìn)程鎖住的文件時(shí),缺省的行為是返回 SQLITE_BUSY。 可以在C代碼中使用 sqlite3_busy_handler() 或 sqlite3_busy_timeout() API 函數(shù)調(diào)整這一行為。
在SQLite數(shù)據(jù)庫中如何列出所有的表和索引?
如果你運(yùn)行 sqlite3 命令行來訪問你的數(shù)據(jù)庫,可以鍵入 “.tables”來獲得所有表的列表。或者,你可以輸入 “.schema” 來看整個(gè)數(shù)據(jù)庫模式,包括所有的表的索引。 輸入這些命令,后面跟一個(gè)LIKE模式匹配可以限制顯示的表。
在一個(gè) C/C++ 程序中(或者腳本語言使用 Tcl/Ruby/Perl/Python 等) 你可以在一個(gè)特殊的名叫 SQLITE_MASTER 上執(zhí)行一個(gè)SELECT查詢以獲得所有 表的索引。每一個(gè) SQLite 數(shù)據(jù)庫都有一個(gè)叫 SQLITE_MASTER 的表, 它定義數(shù)據(jù)庫的模式。 SQLITE_MASTER 表看起來如下:
CREATE TABLE sqlite_master (
type TEXT,
name TEXT,
tbl_name TEXT,
rootpage INTEGER,
sql TEXT
);
對(duì)于表來說,type 字段永遠(yuǎn)是 'table',name 字段永遠(yuǎn)是表的名字。所以,要獲得數(shù)據(jù)庫中所有表的列表, 使用下列SELECT語句:
SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name;
對(duì)于索引,type 等于 'index', name 則是索引的名字,tbl_name 是該索引所屬的表的名字。 不管是表還是索引,sql 字段是原先用 CREATE TABLE 或 CREATE INDEX 語句創(chuàng)建它們時(shí)的命令文本。對(duì)于自動(dòng)創(chuàng)建的索引(用來實(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字段最長是多少?
SQLite 不強(qiáng)制 VARCHAR 的長度。 你可以在 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 支持。你可以使用它來在表的末尾增加一列,可更改表的名稱。 如果需要對(duì)表結(jié)構(gòu)做更復(fù)雜的改變,則必須重新建表。 重建時(shí)可以先將已存在的數(shù)據(jù)放到一個(gè)臨時(shí)表中,刪除原表, 創(chuàng)建新表,然后將數(shù)據(jù)從臨時(shí)表中復(fù)制回來。
如,假設(shè)有一個(gè) t1 表,其中有 "a", "b", "c" 三列, 如果要?jiǎng)h除列 c ,以下過程描述如何做:
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ù)庫中刪除了很多數(shù)據(jù),但數(shù)據(jù)庫文件沒有變小,是Bug嗎?
不是。當(dāng)你從SQLite數(shù)據(jù)庫中刪除數(shù)據(jù)時(shí), 未用的磁盤空間將會(huì)加入一個(gè)內(nèi)部的“自由列表”中。 當(dāng)你下次插入數(shù)據(jù)時(shí),這部分空間可以重用。磁盤空間不會(huì)丟失, 但也不會(huì)返還給操作系統(tǒng)。
如果刪除了大量數(shù)據(jù),而又想縮小數(shù)據(jù)庫文件占用的空間,執(zhí)行 VACUUM 命令。 VACUUM 將會(huì)從頭重新組織數(shù)據(jù)庫。這將會(huì)使用數(shù)據(jù)庫有一個(gè)空的“自由鏈表”, 數(shù)據(jù)庫文件也會(huì)最小。但要注意的是,VACUUM 的執(zhí)行會(huì)需要一些時(shí)間 (在SQLite開發(fā)時(shí),在Linux上,大約每M字節(jié)需要半秒種),并且, 執(zhí)行過程中需要原數(shù)據(jù)庫文件至多兩倍的臨時(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語句不再有效或者無法執(zhí)行時(shí), 將返回一個(gè) SQLITE_SCHEMA 錯(cuò)誤。發(fā)生該錯(cuò)誤時(shí),SQL語句必須使用 sqlite3_prepare() API來重新編譯. 在 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)備好的語句失效的最通常原因是:在語句準(zhǔn)備好后, 數(shù)據(jù)庫的模式又被修改了。另外的原因會(huì)發(fā)生在:
數(shù)據(jù)庫離線:DETACHed.
數(shù)據(jù)庫被 VACUUMed
一個(gè)用戶存儲(chǔ)過程定義被刪除或改變。
一個(gè) collation 序列定義被刪除或改變。
認(rèn)證函數(shù)被改變。
在所有情況下,解決方法是重新編譯并執(zhí)行該SQL語句。 因?yàn)橐粋€(gè)已準(zhǔn)備好的語句可以由于其它進(jìn)程改變數(shù)據(jù)庫模式而失效, 所有使用 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 用起來類似 Pascal 語言。 SQLite 尊循標(biāo)準(zhǔn)。如:
INSERT INTO xyz VALUES('5 O''clock');
Sqlite中如何返回本地化當(dāng)前時(shí)間?
在做ClinicOS的時(shí)候遇到一個(gè)問題,在保存病歷登記時(shí)間時(shí),我使用了“CURRENT_TIMESTAMP”,但這有個(gè)問題,它返回的是UTC Time,這對(duì)我們中國人沒啥用,一直希望能想辦法將它轉(zhuǎn)為localtime。今天剛好有空,所以去查了查Sqlite的Mail List,果然也有人遇到了這個(gè)問題,我從一篇名為《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
嘿嘿,看來如果想得到一個(gè)符合本機(jī)區(qū)域設(shè)置的當(dāng)前時(shí)間,必須用date函數(shù)來轉(zhuǎn)換,
但date只函數(shù)只返回當(dāng)前日期,而我需要的是返回當(dāng)前日期及時(shí)間,所以這里把它換成datetime函數(shù),即:
datetime(CURRENT_TIMESTAMP,'localtime')
以下是sqlite下測試的輸出信息:
sqlite> select CURRENT_TIMESTAMP;
2006-06-18 09:23:36
sqlite> select datetime(CURRENT_TIMESTAMP,'localtime');
2006-06-18 17:23:44
sqlite>
SQLITE分頁
剛開始的時(shí)候沒注意語法
后來才發(fā)現(xiàn),原來用SQLite分頁是世界上最簡單的。
如果我要去11-20的Account表的數(shù)據(jù)
Select * From Account Limit 9 Offset 10;
以上語句表示從Account表獲取數(shù)據(jù),跳過10行,取9行
嗯,我覺得這個(gè)特性足夠讓很多的web中型網(wǎng)站使用這個(gè)了。
也可以這樣寫 select * from account limit10,9和上面的的效果一樣。
這種寫法MySQL也支持。
SQLite不同于其他大部分的SQL數(shù)據(jù)庫引擎,因?yàn)樗氖滓O(shè)計(jì)目標(biāo)就是簡單化:
易于管理
易于使用
易于嵌入其他大型程序
易于維護(hù)和配置
許多人喜歡SQLite因?yàn)樗男∏珊涂焖? 但是這些特性只是它的部分優(yōu)點(diǎn), 使用者還會(huì)發(fā)現(xiàn)SQLite是非常穩(wěn)定的. 出色的穩(wěn)定性源于它的簡單, 越簡單就越不容易出錯(cuò). 除了上述的簡單、小巧和穩(wěn)定性外, 最重要的在于SQLite力爭做到簡單化.
簡單化在一個(gè)數(shù)據(jù)庫引擎中可以說是一個(gè)優(yōu)點(diǎn), 但也可能是個(gè)缺點(diǎn), 主要決定于你想要做什么. 為了達(dá)到簡單化, SQLite省略了一些人們認(rèn)為比較有用的特性, 例如高并發(fā)性、 嚴(yán)格的存取控制、 豐富的內(nèi)置功能、 存儲(chǔ)過程、復(fù)雜的SQL語言特性、 XML以及Java的擴(kuò)展, 超大的萬億級(jí)別的數(shù)據(jù)測量等等. 如果你需要使用上述的這些特性并且不介意它們的復(fù)雜性, 那么SQLite也許就不適合你了. SQLite沒有打算作為一個(gè)企業(yè)級(jí)的數(shù)據(jù)庫引擎, 也并不打算和Oracle或者PostgreSQL競爭.
僅憑經(jīng)驗(yàn)來說SQLite適用于以下場合: 當(dāng)你更看中簡單的管理、使用和維護(hù)數(shù)據(jù)庫, 而不是那些企業(yè)級(jí)數(shù)據(jù)庫提供的不計(jì)其數(shù)的復(fù)雜功能的時(shí)候,使用SQLite是一個(gè)比較明智的選擇. 事實(shí)也證明, 人們?cè)谠S多情況下已經(jīng)清楚的認(rèn)識(shí)到簡單就是最好的選擇.
SQLite最佳試用場合
網(wǎng)站
作為數(shù)據(jù)庫引擎SQLite適用于中小規(guī)模流量的網(wǎng)站(也就是說, 99.9%的網(wǎng)站). SQLite可以處理多少網(wǎng)站流量在于網(wǎng)站的數(shù)據(jù)庫有多大的壓力. 通常來說, 如果一個(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ù)庫幾乎不需要管理, 因此對(duì)于那些無人值守運(yùn)行或無人工技術(shù)支持的設(shè)備或服務(wù), SQLite是一個(gè)很好的選擇. SQLite能很好的適用于手機(jī), PDA, 機(jī)頂盒, 以及其他儀器. 作為一個(gè)嵌入式數(shù)據(jù)庫它也能夠很好的應(yīng)用于客戶端程序.
應(yīng)用程序文件格式
SQLite作為桌面應(yīng)用程序的本地磁盤文件格式取得了巨大成功.例如金融分析工具、CAD 包、檔案管理程序等等. 一般的數(shù)據(jù)庫打開操作需要調(diào)用sqlite3_open()函數(shù),并且標(biāo)記一個(gè)顯式本地事務(wù)的起始點(diǎn)(BEGIN TRANSACTION)來保證以獨(dú)占的方式得到文件的內(nèi)容. 文件保存將執(zhí)行一個(gè)提交(COMMIT)同時(shí)標(biāo)記另一個(gè)顯式本地事務(wù)起始點(diǎn). 這種事務(wù)處理的作用就是保證對(duì)于應(yīng)用程序數(shù)據(jù)文件的更新是原子的、持久的、獨(dú)立的和一致的.
數(shù)據(jù)庫里可以加入一些臨時(shí)的觸發(fā)器,用來把所有的改變記錄在一張臨時(shí)的取消/重做日志表中. 當(dāng)用戶按下取消/重做按鈕的時(shí)候這些改變將可以被回滾. 應(yīng)用這項(xiàng)技術(shù)實(shí)現(xiàn)一個(gè)無限級(jí)的取消/重做功能只需要編寫很少的代碼.
替代某些特別的文件格式
許多程序使用fopen(), fread(), 或 fwrite()函數(shù)創(chuàng)建和管理一些自定義的文件用來保存數(shù)據(jù). 使用SQLite替代這些自定義的文件格式將是一種很好的選擇.
內(nèi)部的或臨時(shí)的數(shù)據(jù)庫
對(duì)于那些有大量的數(shù)據(jù)需要用不同的方式篩選分類的程序, 相對(duì)于編寫同樣功能的代碼, 如果你把數(shù)據(jù)讀入一個(gè)內(nèi)存中的SQLite數(shù)據(jù)庫, 然后使用連接查詢和ORDER BY子句按一定的順序和排列提取需要的數(shù)據(jù), 通常會(huì)更簡單和快速. 按照上述的方法使用內(nèi)嵌的SQLite數(shù)據(jù)庫將會(huì)使程序更富有靈活性, 因?yàn)樘砑有碌牧谢蛩饕挥弥貙懭魏尾樵冋Z句.
命令行數(shù)據(jù)集分析工具
有經(jīng)驗(yàn)的SQL用戶可以使用SQLite命令行程序去分析各種混雜的數(shù)據(jù)集. 原是數(shù)據(jù)可以從CSV(逗號(hào)分隔值文件)文件中導(dǎo)入, 然后被切分產(chǎn)生無數(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ù)庫來做同樣的事情. 在這種情況下使用SQLite的好處是: SQLite的部署更為簡單并且結(jié)果數(shù)據(jù)庫是一個(gè)單獨(dú)的文件, 你可以把它存儲(chǔ)在軟盤或者優(yōu)盤或者直接通過email發(fā)給同事.
在Demo或測試版的時(shí)候作為企業(yè)級(jí)數(shù)據(jù)庫的替代品
如果你正在編寫一個(gè)使用企業(yè)級(jí)數(shù)據(jù)庫引擎的客戶端程序, 使用一個(gè)允許你連接不同SQL數(shù)據(jù)庫引擎的通用型數(shù)據(jù)庫后臺(tái)將是很有意義的. 其更大的意義在于將SQLite數(shù)據(jù)庫引擎靜態(tài)的連接到客戶端程序當(dāng)中,從而內(nèi)嵌SQLite作為混合的數(shù)據(jù)庫支持. 這樣客戶端程序就可以使用SQLite數(shù)據(jù)庫文件做獨(dú)立的測試或者驗(yàn)證.
本文來自: (www.91linux.com) 詳細(xì)出處參考:http://www.91linux.com/html/article/database/sqlite/200812/12-14611.html
數(shù)據(jù)庫教學(xué)
因?yàn)镾QLite的安裝和使用非常的簡單(安裝過程幾乎忽略不計(jì), 只需要拷貝SQLite源代碼或sqlite.exe可執(zhí)行文件到目標(biāo)主機(jī), 然后直接運(yùn)行就可以) 所以它非常適合用來講解SQL語句. 同學(xué)們可以非常簡單的創(chuàng)建他們喜歡的數(shù)據(jù)庫, 然后通過電子郵件發(fā)給老師批注或打分. 對(duì)于那些感興趣怎樣實(shí)現(xiàn)一個(gè)關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)的高層次的學(xué)生, 按照模塊化設(shè)計(jì)且擁有很好的注釋和文檔的SQLite源代碼, 將為他們打下良好的基礎(chǔ). 這并不是說SQLite就是如何實(shí)現(xiàn)其他數(shù)據(jù)庫引擎的精確模型, 但是很適合學(xué)生們了解SQLite是如何快速工作的, 從而掌握其他數(shù)據(jù)庫系統(tǒng)的設(shè)計(jì)實(shí)現(xiàn)原則.
試驗(yàn)SQL語言的擴(kuò)展
SQLite簡單且模塊化的設(shè)計(jì)使得它可以成為一個(gè)用來測試數(shù)據(jù)庫語言特性或新想法的優(yōu)秀的原型平臺(tái).
哪些場合適合使用其他的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)
客戶端/服務(wù)器程序
如果你有許多的客戶端程序要通過網(wǎng)絡(luò)訪問一個(gè)共享的數(shù)據(jù)庫, 你應(yīng)當(dāng)考慮用一個(gè)客戶端/服務(wù)器數(shù)據(jù)庫來替代SQLite. SQLite可以通過網(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ù)庫的同一部分, 從而導(dǎo)致數(shù)據(jù)庫出錯(cuò). 因?yàn)檫@些問題是文件系統(tǒng)執(zhí)行的時(shí)候本質(zhì)上存在的bug, 因此SQLite沒有辦法避免它們.
好的經(jīng)驗(yàn)告訴我們, 應(yīng)該避免在許多計(jì)算機(jī)需要通過一個(gè)網(wǎng)絡(luò)文件系統(tǒng)同時(shí)訪問同一個(gè)數(shù)據(jù)庫的情況下使用SQLite.
高流量網(wǎng)站
SQLite通常情況下用作一個(gè)網(wǎng)站的后臺(tái)數(shù)據(jù)庫可以很好的工作. 但是如果你的網(wǎng)站的訪問量大到你開始考慮采取分布式的數(shù)據(jù)庫部署, 那么你應(yīng)當(dāng)毫不猶豫的考慮用一個(gè)企業(yè)級(jí)的客戶端/服務(wù)器數(shù)據(jù)庫來替代SQLite.
超大的數(shù)據(jù)集
當(dāng)你在SQLite中開始一個(gè)事務(wù)處理的時(shí)候(事務(wù)處理會(huì)在任何寫操作發(fā)生之前產(chǎn)生, 而不是必須要顯示的調(diào)用BEGIN...COMMIT), 數(shù)據(jù)庫引擎將不得不分配一小塊臟頁(文件緩沖頁面)來幫助它自己管理回滾操作. 每1MB的數(shù)據(jù)庫文件SQLite需要256字節(jié). 對(duì)于小型的數(shù)據(jù)庫這些空間不算什么, 但是當(dāng)數(shù)據(jù)庫增長到數(shù)十億字節(jié)的時(shí)候, 緩沖頁面的尺寸就會(huì)相當(dāng)?shù)拇罅? 如果你需要存儲(chǔ)或修改幾十GB的數(shù)據(jù), 你應(yīng)該考慮用其他的數(shù)據(jù)庫引擎.
高并發(fā)訪問
SQLite對(duì)于整個(gè)數(shù)據(jù)庫文件進(jìn)行讀取/寫入鎖定. 這意味著如果任何進(jìn)程讀取了數(shù)據(jù)庫中的某一部分, 其他所有進(jìn)程都不能再對(duì)該數(shù)據(jù)庫的任何部分進(jìn)行寫入操作. 同樣的, 如果任何一個(gè)進(jìn)程在對(duì)數(shù)據(jù)庫進(jìn)行寫入操作, 其他所有進(jìn)程都不能再讀取該數(shù)據(jù)庫的任何部分. 對(duì)于大多數(shù)情況這不算是什么問題. 在這些情況下每個(gè)程序使用數(shù)據(jù)庫的時(shí)間都很短暫, 并且不會(huì)獨(dú)占, 這樣鎖定至多會(huì)存在十幾毫秒. 但是如果有些程序需要高并發(fā), 那么這些程序就需要尋找其他的解決方案了