91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 0.08M
    文件類型: .doc
    金幣: 1
    下載: 0 次
    發布日期: 2020-12-26
  • 語言: C#
  • 標簽: 學習??sql??

資源簡介

關鍵字: sqlite入門至精通 

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

   把查詢結果用屏幕輸出
   >.output stdout

   8)把表結構輸出,同時索引也會輸出
     .dump 表名
   9)退出 
   >.exit 或者.quit 

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

3。SQL語法 
   由于以前用SQLServer或者ISeries,所以DDL的語法很汗顏
   1)創建一個單個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)創建一個多個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)創建索引 
   CREATE  INDEX [IX_Account] ON  [Account]([IsCheck], [UserName]);
   
   還可以視圖等等。
4.還有很有用的SQL
  Select * from Sqlite_master 
  Select datetime('now')
  Select date('now')
  Select time('now')
  

SQLite 內建函數表 

算術函數 

abs(X) 

返回給定數字表達式的絕對值。 

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

返回表達式的最大值。 

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

返回表達式的最小值。 

random(*) 

返回隨機數。 

round(X[,Y]) 

返回數字表達式并四舍五入為指定的長度或精度。 

字符處理函數 

length(X) 

返回給定字符串表達式的字符個數。 

lower(X) 

將大寫字符數據轉換為小寫字符數據后返回字符表達式。 

upper(X) 

返回將小寫字符數據轉換為大寫的字符表達式。 

substr(X,Y,Z) 

返回表達式的一部分。 

randstr() 

  

quote(A) 

  

like(A,B) 

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

glob(A,B) 

  

條件判斷函數 

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

  

ifnull(X,Y) 

  

nullif(X,Y) 

  

集合函數 

avg(X) 

返回組中值的平均值。 

count(X) 

返回組中項目的數量。 

max(X) 

返回組中值的最大值。 

min(X) 

返回組中值的最小值。 

sum(X) 

返回表達式中所有值的和。 

其他函數 

typeof(X) 

返回數據的類型。 

last_insert_rowid() 

返回最后插入的數據的 ID  

sqlite_version(*) 

返回 SQLite 的版本。 

change_count() 

返回受上一語句影響的行數。 

last_statement_change_count() 

  


oh,還有就是看到有人說,好像成批插入的時候,啟動事務,比不啟動事務快n倍
還有就是盡量使用參數化的SQL,估計和商用DB一樣能夠自動Prepare.

=========== 

sqlite可以在shell/dos command底下直接執行命令:
sqlite3 film.db "select * from film;"
輸出 HTML 表格: 
sqlite3 -html film.db "select * from film;"
將數據庫「倒出來」:
sqlite3 film.db ".dump" > output.sql
利用輸出的資料,建立一個一模一樣的數據庫(加上以上指令,就是標準的SQL數據庫備份了):
sqlite3 film.db < output.sql
在大量插入資料時,你可能會需要先打這個指令:
begin;
插入完資料后要記得打這個指令,資料才會寫進數據庫中:
commit; 

SQLITE深入------常見問題 

如何建立自動增長字段? 

簡短回答:聲明為 INTEGER PRIMARY KEY 的列將會自動增長 。 

長一點的答案: 如果你聲明表的一列為 INTEGER PRIMARY KEY,那么, 每當你在該列上插入一NULL值時, NULL自動被轉換為一個比該列中最大值大1的一個整數,如果表是空的, 將會是1。 (如果是最大可能的主鍵 9223372036854775807,那個,將鍵值將是隨機未使用的數。) 如,有下列表: 

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

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

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

多個應用程序或一個應用程序的多個實例可以同時訪問同一個數據庫文件嗎? 

多個進程可同時打開同一個數據庫。多個進程可以同時進行SELECT 操作,但在任一時刻,只能有一個進程對數據庫進行更改。 

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

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

但是,Client/Server數據庫引擎(如 PostgreSQL, MySQL, 或 Oracle)通常支持更高級別的并發,并且允許多個進程同時寫同一個數據庫。 這種機制在Client/Server結構的數據庫上是可能的,因為總是有一個單一的服務器進程很好地控制、協調對數據庫的訪問。如果你的應用程序需要很多的并發,那么你應該考慮使用一個Client/Server 結構的數據庫。但經驗表明,很多應用程序需要的并發,往往比其設計者所想象的少得多。 

當SQLite試圖訪問一個被其它進程鎖住的文件時,缺省的行為是返回 SQLITE_BUSY。 可以在C代碼中使用 sqlite3_busy_handler() 或 sqlite3_busy_timeout() API 函數調整這一行為。 

在SQLite數據庫中如何列出所有的表和索引? 

如果你運行 sqlite3 命令行來訪問你的數據庫,可以鍵入 “.tables”來獲得所有表的列表。或者,你可以輸入 “.schema” 來看整個數據庫模式,包括所有的表的索引。 輸入這些命令,后面跟一個LIKE模式匹配可以限制顯示的表。 

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

CREATE TABLE sqlite_master (
type TEXT,
name TEXT,
tbl_name TEXT,
rootpage INTEGER,
sql TEXT
);
對于表來說,type 字段永遠是 'table',name 字段永遠是表的名字。所以,要獲得數據庫中所有表的列表, 使用下列SELECT語句: 

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

SQLITE_MASTER 表是只讀的。不能對它使用 UPDATE、INSERT 或 DELETE。 它會被 CREATE TABLE、CREATE INDEX、DROP TABLE 和 DROP INDEX 命令自動更新。 

臨時表不會出現在 SQLITE_MASTER 表中。臨時表及其索引和觸發器存放在另外一個叫 SQLITE_TEMP_MASTER 的表中。SQLITE_TEMP_MASTER 跟 SQLITE_MASTER 差不多,但它只是對于創建那些臨時表的應用可見。如果要獲得所有表的列表, 不管是永久的還是臨時的,可以使用類似下面的命令: 

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

在SQLite中,VARCHAR字段最長是多少? 

SQLite 不強制 VARCHAR 的長度。 你可以在 SQLITE 中聲明一個 VARCHAR(10),SQLite還是可以很高興地允許你放入500個字符。 并且這500個字符是原封不動的,它永遠不會被截斷。 

SQLite支持二進制大對象嗎? 

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

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

SQLite 有有限地 ALTER TABLE 支持。你可以使用它來在表的末尾增加一列,可更改表的名稱。 如果需要對表結構做更復雜的改變,則必須重新建表。 重建時可以先將已存在的數據放到一個臨時表中,刪除原表, 創建新表,然后將數據從臨時表中復制回來。 

如,假設有一個 t1 表,其中有 "a", "b", "c" 三列, 如果要刪除列 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; 

在數據庫中刪除了很多數據,但數據庫文件沒有變小,是Bug嗎? 

不是。當你從SQLite數據庫中刪除數據時, 未用的磁盤空間將會加入一個內部的“自由列表”中。 當你下次插入數據時,這部分空間可以重用。磁盤空間不會丟失, 但也不會返還給操作系統。 

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

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

SQLITE_SCHEMA error是什么錯誤?為什么會出現該錯誤? 

當一個準備好的(prepared)SQL語句不再有效或者無法執行時, 將返回一個 SQLITE_SCHEMA 錯誤。發生該錯誤時,SQL語句必須使用 sqlite3_prepare() API來重新編譯. 在 SQLite 3 中, 一個 SQLITE_SCHEMA 錯誤只會發生在用 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 執行 SQL 時。而不會發生在使用 sqlite3_exec()時。 在版本2中不是這樣。 

準備好的語句失效的最通常原因是:在語句準備好后, 數據庫的模式又被修改了。另外的原因會發生在: 

數據庫離線:DETACHed. 
數據庫被 VACUUMed 
一個用戶存儲過程定義被刪除或改變。 
一個 collation 序列定義被刪除或改變。 
認證函數被改變。 
在所有情況下,解決方法是重新編譯并執行該SQL語句。 因為一個已準備好的語句可以由于其它進程改變數據庫模式而失效, 所有使用 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 的代碼都應準備處理 SQLITE_SCHEMA 錯誤。下面給出一個例子: 


    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 ); 

  

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

SQL 標準規定,在字符串中,單引號需要使用逃逸字符,即在一行中使用兩個單引號。在這方面 SQL 用起來類似 Pascal 語言。 SQLite 尊循標準。如: 

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


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

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

 

 

 

嘿嘿,看來如果想得到一個符合本機區域設置的當前時間,必須用date函數來轉換,

 

但date只函數只返回當前日期,而我需要的是返回當前日期及時間,所以這里把它換成datetime函數,即:

 

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分頁 
剛開始的時候沒注意語法
后來才發現,原來用SQLite分頁是世界上最簡單的。
如果我要去11-20的Account表的數據
Select * From Account Limit 9 Offset 10;
以上語句表示從Account表獲取數據,跳過10行,取9行
嗯,我覺得這個特性足夠讓很多的web中型網站使用這個了。
也可以這樣寫 select * from account limit10,9和上面的的效果一樣。
這種寫法MySQL也支持。 

SQLite適用的范圍 

  

SQLite不同于其他大部分的SQL數據庫引擎,因為它的首要設計目標就是簡單化: 

易于管理 
易于使用 
易于嵌入其他大型程序 
易于維護和配置 
許多人喜歡SQLite因為它的小巧和快速但是這些特性只是它的部分優點使用者還會發現SQLite是非常穩定的出色的穩定性源于它的簡單越簡單就越不容易出錯除了上述的簡單、小巧和穩定性外最重要的在于SQLite力爭做到簡單化

簡單化在一個數據庫引擎中可以說是一個優點但也可能是個缺點主要決定于你想要做什么為了達到簡單化, SQLite省略了一些人們認為比較有用的特性例如高并發性、嚴格的存取控制、 豐富的內置功能、 存儲過程、復雜的SQL語言特性、 XML以及Java的擴展超大的萬億級別的數據測量等等如果你需要使用上述的這些特性并且不介意它們的復雜性那么SQLite也許就不適合你了. SQLite沒有打算作為一個企業級的數據庫引擎也并不打算和Oracle或者PostgreSQL競爭

僅憑經驗來說SQLite適用于以下場合當你更看中簡單的管理、使用和維護數據庫而不是那些企業級數據庫提供的不計其數的復雜功能的時候,使用SQLite是一個比較明智的選擇事實也證明人們在許多情況下已經清楚的認識到簡單就是最好的選擇

SQLite最佳試用場合 
網站 

作為數據庫引擎SQLite適用于中小規模流量的網站(也就是說, 99.9%的網站). SQLite可以處理多少網站流量在于網站的數據庫有多大的壓力通常來說如果一個網站的點擊率少于100000/天的話, SQLite是可以正常運行的. 100000/天是一個保守的估計不是一個準確的上限事實證明即使是10倍的上述流量的情況下SQLite依然可以正常運行

嵌入式設備和應用軟件 

因為SQLite數據庫幾乎不需要管理因此對于那些無人值守運行或無人工技術支持的設備或服務, SQLite是一個很好的選擇. SQLite能很好的適用于手機, PDA, 機頂盒以及其他儀器作為一個嵌入式數據庫它也能夠很好的應用于客戶端程序

應用程序文件格式 

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

數據庫里可以加入一些臨時的觸發器,用來把所有的改變記錄在一張臨時的取消/重做日志表中當用戶按下取消/重做按鈕的時候這些改變將可以被回滾應用這項技術實現一個無限級的取消/重做功能只需要編寫很少的代碼

替代某些特別的文件格式 

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

內部的或臨時的數據庫 

對于那些有大量的數據需要用不同的方式篩選分類的程序相對于編寫同樣功能的代碼如果你把數據讀入一個內存中的SQLite數據庫然后使用連接查詢和ORDER BY子句按一定的順序和排列提取需要的數據通常會更簡單和快速按照上述的方法使用內嵌的SQLite數據庫將會使程序更富有靈活性因為添加新的列或索引不用重寫任何查詢語句

命令行數據集分析工具 

有經驗的SQL用戶可以使用SQLite命令行程序去分析各種混雜的數據集原是數據可以從CSV(逗號分隔值文件)文件中導入然后被切分產生無數的綜合數據報告可能得用法包括網站日志分析運動統計分析編輯規劃標準分析試驗結果

當然你也可以用企業級的客戶端/服務器數據庫來做同樣的事情在這種情況下使用SQLite的好處是: SQLite的部署更為簡單并且結果數據庫是一個單獨的文件你可以把它存儲在軟盤或者優盤或者直接通過email發給同事

Demo或測試版的時候作為企業級數據庫的替代品 

如果你正在編寫一個使用企業級數據庫引擎的客戶端程序使用一個允許你連接不同SQL數據庫引擎的通用型數據庫后臺將是很有意義的其更大的意義在于將SQLite數據庫引擎靜態的連接到客戶端程序當中,從而內嵌SQLite作為混合的數據庫支持這樣客戶端程序就可以使用SQLite數據庫文件做獨立的測試或者驗證

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

  

數據庫教學 

因為SQLite的安裝和使用非常的簡單(安裝過程幾乎忽略不計只需要拷貝SQLite源代碼或sqlite.exe可執行文件到目標主機然后直接運行就可以所以它非常適合用來講解SQL語句同學們可以非常簡單的創建他們喜歡的數據庫然后通過電子郵件發給老師批注或打分對于那些感興趣怎樣實現一個關系型數據庫管理系統(RDBMS)的高層次的學生按照模塊化設計且擁有很好的注釋和文檔的SQLite源代碼將為他們打下良好的基礎這并不是說SQLite就是如何實現其他數據庫引擎的精確模型但是很適合學生們了解SQLite是如何快速工作的從而掌握其他數據庫系統的設計實現原則

試驗SQL語言的擴展 

SQLite簡單且模塊化的設計使得它可以成為一個用來測試數據庫語言特性或新想法的優秀的原型平臺

哪些場合適合使用其他的關系型數據庫管理系統(RDBMS
客戶端/服務器程序 

  

如果你有許多的客戶端程序要通過網絡訪問一個共享的數據庫你應當考慮用一個客戶端/服務器數據庫來替代SQLite. SQLite可以通過網絡文件系統工作但是因為和大多數網絡文件系統都存在延時因此執行效率不會很高此外大多數網絡文件系統在實現文件邏輯鎖的方面都存在著bug(包括Unix windows). 如果文件鎖沒有正常的工作就可能出現在同一時間兩個或更多的客戶端程序更改同一個數據庫的同一部分從而導致數據庫出錯因為這些問題是文件系統執行的時候本質上存在的bug, 因此SQLite沒有辦法避免它們. 

好的經驗告訴我們應該避免在許多計算機需要通過一個網絡文件系統同時訪問同一個數據庫的情況下使用SQLite. 

高流量網站 

SQLite通常情況下用作一個網站的后臺數據庫可以很好的工作但是如果你的網站的訪問量大到你開始考慮采取分布式的數據庫部署那么你應當毫不猶豫的考慮用一個企業級的客戶端/服務器數據庫來替代SQLite. 

超大的數據集 

當你在SQLite中開始一個事務處理的時候(事務處理會在任何寫操作發生之前產生而不是必須要顯示的調用BEGIN...COMMIT), 數據庫引擎將不得不分配一小塊臟頁(文件緩沖頁面)來幫助它自己管理回滾操作1MB的數據庫文件SQLite需要256字節對于小型的數據庫這些空間不算什么但是當數據庫增長到數十億字節的時候緩沖頁面的尺寸就會相當的大了如果你需要存儲或修改幾十GB的數據你應該考慮用其他的數據庫引擎

高并發訪問 

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

資源截圖

代碼片段和文件信息

評論

共有 條評論