激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sqlite - SQLite數據庫管理系統-我所認識的數據庫引擎

SQLite數據庫管理系統-我所認識的數據庫引擎

2020-06-03 16:11SQLite教程網 Sqlite

SQLite是一款輕量級的、被設計用于嵌入式系統的關聯式數據庫管理系統,SQLite 是一個實現自我依賴、純客戶端、零配置且支持事務的數據庫引擎

SQLite 是一款輕量級的、被設計用于嵌入式系統的關聯式數據庫管理系統。SQLite 是一個實現自我依賴、純客戶端、零配置且支持事務的數據庫引擎。它由D. Richard Hipp首次開發,目前已是世界上最廣泛部署的開源數據庫引擎。

本文中,我們將介紹如下內容:

創建一個SQLite 數據庫

復制代碼 代碼如下:

SQLiteConnection conn = new SQLiteConnection("Data Source=mytest.s3db");
conn.Open();


SQLite 數據插入

  1. /// <summary> 
  2. /// Allows the programmer to easily insert into the DB 
  3. /// </summary> 
  4. /// <param name="tableName">The table into which we insert the data.</param> 
  5. /// <param name="data">A dictionary containing the column names and data for the insert.</param> 
  6. /// <returns>A boolean true or false to signify success or failure.</returns> 
  7. public bool Insert(string tableName, Dictionary<string, string> data) 
  8. Boolean returnCode = true
  9. StringBuilder columnBuilder = new StringBuilder(); 
  10. StringBuilder valueBuilder = new StringBuilder(); 
  11. foreach (KeyValuePair<string, string> val in data) 
  12. columnBuilder.AppendFormat(" {0},", val.Key); 
  13. valueBuilder.AppendFormat(" '{0}',", val.Value); 
  14. columnBuilder.Remove(columnBuilder.Length - 1, 1); 
  15. valueBuilder.Remove(valueBuilder.Length - 1, 1); 
  16. try 
  17. this.ExecuteNonQuery(string.Format("INSERT INTO {0}({1}) VALUES({2});"
  18. tableName, columnBuilder, valueBuilder)); 
  19. catch (Exception ex) 
  20. mLog.Warn(ex.ToString()); 
  21. returnCode = false
  22. return returnCode; 
  1. DateTime entryTime; 
  2. string name = string.Empty, title = string.Empty; 
  3. GetSampleData(out name, out title, out entryTime); 
  4. int id = random.Next(); 
  5. insertParameterDic.Add("Id", id.ToString()); 
  6. insertParameterDic.Add("Name", name); 
  7. insertParameterDic.Add("Title", title); 
  8. insertParameterDic.Add("EntryTime"
  9. entryTime.ToString("yyyy-MM-dd HH:mm:ss")); 
  10.  
  11. db.Insert("Person", insertParameterDic); 

SQLite 的事務處理方式

Begin Transaction:

SQLite數據庫管理系統-我所認識的數據庫引擎

Commit Transaction:

SQLite數據庫管理系統-我所認識的數據庫引擎

Rollback Transaction:

SQLite數據庫管理系統-我所認識的數據庫引擎

 

復制代碼 代碼如下:

try
{
db.OpenTransaction();
Insert4Native();
db.CommiteTransaction();
}
catch (System.Exception ex)
{
mLog.Error(ex.ToString());
db.RollbackTransaction();
}


SQLite 的索引

索引是一種用來優化查詢的特性,在數據中分為聚簇索引和非聚簇索引;前者是由數據庫中數據組織方式決定的,比如我們在往數據庫中一條一條插入數據時,聚簇索引能夠保證按順序插入,插入后數據的位置和結構不變。非聚簇索引是指我們手動、顯式創建的索引,可以為數據庫中的每個列創建索引,和字典中的索引類似,遵循的原則是對有分散性和組合型的列建立索引,以利于大數據和復雜查詢情況下提高查詢效率。

SQLite數據庫管理系統-我所認識的數據庫引擎

 

復制代碼 代碼如下:

/// <summary>
/// Create index
/// </summary>
/// <param name="tableName">table name</param>
/// <param name="columnName">column name</param>
/// <param name="indexName">index name</param>
public void CreateIndex(string tableName, string columnName, string indexName)
{
string createIndexText = string.Format("CREATE INDEX {0} ON {1} ({2});",
indexName, tableName, columnName);
ExecuteNonQuery(createIndexText);
}


簡單查詢、無關數據庫大小情況下對查詢效率的測試結果如下(700,000條數據):

復制代碼 代碼如下:

string sql = "SELECT LeafName FROM File WHERE Length > 5000";

SQLite數據庫管理系統-我所認識的數據庫引擎

復雜查詢情況下對查詢效率的測試結果如下(~40,000條數據):

復制代碼 代碼如下:
string sql = "SELECT folder.Location AS FilePath" + "FROM Folder folder LEFT JOIN File file ON file.ParentGuid=folder.Guid" +"WHERE file.Length > 5000000 GROUP BY File.LeafName";

SQLite數據庫管理系統-我所認識的數據庫引擎

SQLite 的觸發器(Trigger)

觸發器是指當一個特定的數據庫事件(DELETE, INSERT, or UPDATE)發生以后自動執行的數據庫操作,  我們可以把觸發器理解為高級語言中的事件(Event)。

假設我有兩個表

Folder(Guid VCHAR(255) NOT NULL, Deleted BOOLEAN DEFAULT 0)

File(ParentGuid VCHAR(255) NOT NULL, Deleted BOOLEAN DEFAULT 0)

在Folder 表中創建一個觸發器Update_Folder_Deleted:

復制代碼 代碼如下:
CREATE TRIGGER Update_Folder_Deleted UPDATE Deleted ON Folder Begin UPDATE File SET Deleted=new.Deleted WHERE ParentGuid=old.Guid; END;

創建完觸發器以后在執行以下語句:

復制代碼 代碼如下:
UPDATE Folder SET Deleted=1 WHERE Guid='13051a74-a09c-4b71-ae6d-42d4b1a4a7ae'

以上語句將會導致下面的語句自動執行:

復制代碼 代碼如下:
UPDATE File SET Deleted=1 WHERE ParentGuid='13051a74-a09c-4b71-ae6d-42d4b1a4a7ae'

SQLite 的視圖(View)

視圖可以是一個虛擬表,里面可以存儲按照一定條件過濾出來的數據集合,這樣我們再下次想得到這些特定數據集合的時候就不用通過復雜查詢來獲得,簡單的查詢指定視圖就可以得到想要的數據。

在下個例子中,我們創建一個簡單的視圖:

SQLite數據庫管理系統-我所認識的數據庫引擎

基于上面的查詢結果我們創建一個視圖:

SQLite數據庫管理系統-我所認識的數據庫引擎

SQLite 命令行工具

SQLite 庫中包含了一個SQLite3.exe 的命令行工具,它可以實現SQLite 各項基本操作。這里只介紹一下如何使用它來分析我們的查詢結果:

1. CMD->sqlite3.exe MySQLiteDbWithoutIndex.s3db

SQLite數據庫管理系統-我所認識的數據庫引擎

2. 開啟EXPLAIN 功能并分析指定查詢結果

SQLite數據庫管理系統-我所認識的數據庫引擎

3. 重新使用命令行打開一個有索引的數據庫并執行前兩步

SQLite數據庫管理系統-我所認識的數據庫引擎

4. 通過比較兩個不同查詢語句的分析結果,我們可以發現如果查詢過程中使用了索引,SQLite 會在detail 列中提示我們。

5. 要注意的是每條語句后面都要加分號“;”

SQLite一些常見的使用限制

1. SQLite 不支持Unicode 字符的大小寫比較,請看以下測試結果:

SQLite數據庫管理系統-我所認識的數據庫引擎

2. 如何處理SQLite 轉義字符:

復制代碼 代碼如下:
INSERT INTO xyz VALUES('5 O''clock');

3. 一條復合SELECT語句的條數限制: 一條復合查詢語句是指多條SELECT語句由 UNION, UNION ALL, EXCEPT, or INTERSECT 連接起來. SQLite進程的代碼生成器使用遞歸算法來組合SELECT語句。為了降低堆棧的大小,SQLite 的設計者們限制了一條復合SELECT語句的條目數量。 SQLITE_MAX_COMPOUND_SELECT的默認值是500. 這個值沒有嚴格限制,在實踐中,幾乎很難看到一條復合查詢語句的條目數大于500的。

這里提到復合查詢的原因是我們可以使用它來幫助我們快速插入大量數據:

復制代碼 代碼如下:
public void Insert4SelectUnion() { bool newQuery = true; StringBuilder query = new StringBuilder(4 * ROWS4ACTION); for (int i = 0; i < ROWS4ACTION; i++) { if (newQuery) { query.Append("INSERT INTO Person"); newQuery = false; } else { query.Append(" UNION ALL"); } DateTime entryTime; string name = string.Empty, title = string.Empty; GetSampleData(out name, out title, out entryTime); int id = random.Next(); query.AppendFormat(" SELECT '{0}','{1}','{2}','{3}'", id, name, title, entryTime.ToString("yyyy-MM-dd HH:mm:ss")); if (i % 499 == 0) { db.ExecuteNonQuery(query.ToString()); query.Remove(0, query.Length); newQuery = true; } } //executing remaining lines if (!newQuery) { db.ExecuteNonQuery(query.ToString()); query.Remove(0, query.Length); } }

延伸 · 閱讀

精彩推薦
  • SqliteSQLite 入門教程三 好多約束 Constraints

    SQLite 入門教程三 好多約束 Constraints

    在上一篇隨筆的結尾,我提到了SQLite的約束, 但是在那里我把它翻譯成了限定符,不太準確,這里先更正一下,應該翻譯成約束更貼切一點。 那么什么是...

    SQLite入門教程4572020-06-05
  • Sqlite基于sqlite特殊字符轉義的實現方法

    基于sqlite特殊字符轉義的實現方法

    本篇文章是對sqlite特殊字符轉義的實現方法進行了詳細的分析介紹,需要的朋友參考下 ...

    sqlite數據庫教程網4132020-06-04
  • SqliteSQLite 內存數據庫學習手冊

    SQLite 內存數據庫學習手冊

    這篇文章主要介紹SQLite 內存數據庫的使用方法, 需要的朋友可以參考下 ...

    SQLite教程網3292020-06-06
  • SqliteSQLite中重置自動編號列的方法

    SQLite中重置自動編號列的方法

    這篇文章主要介紹了SQLite中重置自動編號列的方法,本文講解了3種情況和其對應解決方法,需要的朋友可以參考下 ...

    dodo84492020-06-08
  • SqliteSQLite中的WAL機制詳細介紹

    SQLite中的WAL機制詳細介紹

    這篇文章主要介紹了SQLite中的WAL機制詳細介紹,本文講解了什么是WAL、WAL如何工作、WAL的優點與缺點、WAL引入的兼容性問題、WAL引入的性能問題等內容,需要...

    dodo83402020-06-08
  • Sqlite詳解SQLite中的查詢規劃器

    詳解SQLite中的查詢規劃器

    這篇文章主要介紹了詳解SQLite中的查詢規劃器,SQLite是一個開源的嵌入式數據庫,需要的朋友可以參考下...

    SQLite教程網8892021-10-25
  • SqliteSQLite 錯誤碼整理

    SQLite 錯誤碼整理

    這篇文章主要介紹了SQLite 錯誤碼,方便大家在開發過程中快速解決問題 ...

    SQLite教程網5532020-06-06
  • SqliteSQLite速度評測代碼

    SQLite速度評測代碼

    SQLite 作為一個輕量級嵌入式數據庫,還是非常好用的。雨痕極力推薦~~~~~~ ...

    SQLite教程網5832020-06-01
主站蜘蛛池模板: 日韩电影一区二区三区 | 国产精品久久久毛片 | 免费在线中文字幕 | 一级性生活视频 | 97se亚洲综合在线韩国专区福利 | 久久国产精品成人免费网站 | 在线免费日本 | 91久久国产综合久久91猫猫 | 国产一区在线免费 | 久久精品欧美一区 | 久久亚洲网 | 国产一级在线看 | 涩涩激情网 | 亚洲性生活免费视频 | 欧洲性xxxxx| 一级片久久免费 | 国产老师做www爽爽爽视频 | 国产日韩a | 日韩黄色片免费看 | 99re热视频这里只精品 | 羞羞视频一区 | 毛片视频网址 | 性高跟鞋xxxxhd4kvideos | 亚洲免费视 | 国产有色视频 | 亚洲国产网址 | 国产乱xxxx | 男女污视频在线观看 | 成人在线观看免费视频 | 看片一区 | 老女人碰碰在线碰碰视频 | 精品国产一二区 | 在线天堂中文字幕 | 色阁av| 久草在线高清 | 欧美成人午夜精品久久久 | xxnxx中国18 | 亚洲一区二区三区四区精品 | 最新中文在线视频 | 国产色视频在线观看免费 | 免费黄色短视频网站 |