亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQLite > 正文

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

2020-01-31 15:12:41
字體:
來源:轉載
供稿:網友

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

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

創建一個SQLite 數據庫

復制代碼 代碼如下:

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

SQLite 數據插入
復制代碼 代碼如下:

/// <summary>
/// Allows the programmer to easily insert into the DB
/// </summary>
/// <param name="tableName">The table into which we insert the data.</param>
/// <param name="data">A dictionary containing the column names and data for the insert.</param>
/// <returns>A boolean true or false to signify success or failure.</returns>
public bool Insert(string tableName, Dictionary<string, string> data)
{
Boolean returnCode = true;
StringBuilder columnBuilder = new StringBuilder();
StringBuilder valueBuilder = new StringBuilder();
foreach (KeyValuePair<string, string> val in data)
{
columnBuilder.AppendFormat(" {0},", val.Key);
valueBuilder.AppendFormat(" '{0}',", val.Value);
}
columnBuilder.Remove(columnBuilder.Length - 1, 1);
valueBuilder.Remove(valueBuilder.Length - 1, 1);
try
{
this.ExecuteNonQuery(string.Format("INSERT INTO {0}({1}) VALUES({2});",
tableName, columnBuilder, valueBuilder));
}
catch (Exception ex)
{
mLog.Warn(ex.ToString());
returnCode = false;
}
return returnCode;
}

復制代碼 代碼如下:

DateTime entryTime;
string name = string.Empty, title = string.Empty;
GetSampleData(out name, out title, out entryTime);
int id = random.Next();
insertParameterDic.Add("Id", id.ToString());
insertParameterDic.Add("Name", name);
insertParameterDic.Add("Title", title);
insertParameterDic.Add("EntryTime",
entryTime.ToString("yyyy-MM-dd HH:mm:ss"));

db.Insert("Person", insertParameterDic);

SQLite 的事務處理方式

Begin Transaction:

begin-stmt

Commit Transaction:

commit-stmt

Rollback Transaction:

rollback-stmt

復制代碼 代碼如下:

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

SQLite 的索引

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

create-index-stmt

復制代碼 代碼如下:

/// <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";

Capture

復雜查詢情況下對查詢效率的測試結果如下(~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";

Capture2

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)

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

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

Capture

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

Capture2

SQLite 命令行工具

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

1. CMD->sqlite3.exe MySQLiteDbWithoutIndex.s3db

Capture

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

Capture

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

Capture

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

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

SQLite一些常見的使用限制

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

Capture

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩亚洲欧美成人| 久99九色视频在线观看| 欧美日韩视频免费播放| 91精品国产综合久久香蕉最新版| 日韩av手机在线观看| 深夜福利亚洲导航| 激情久久av一区av二区av三区| 中文字幕国产精品| 狠狠色噜噜狠狠狠狠97| 欧美性猛交xxxx黑人猛交| www.日韩欧美| 中文字幕亚洲激情| 亚洲韩国日本中文字幕| 亚洲国产精品va在看黑人| 最近免费中文字幕视频2019| 91精品国产一区| 国产精欧美一区二区三区| 91精品国产色综合久久不卡98口| 日韩中文字在线| 国产精品69精品一区二区三区| 北条麻妃一区二区在线观看| 成人黄色av免费在线观看| 午夜精品美女自拍福到在线| 最近2019免费中文字幕视频三| 在线精品国产欧美| 国产精品一区二区久久| 成人在线视频网站| 欧美一乱一性一交一视频| 国产精品视频专区| 国产一区二区三区在线观看网站| 色综合老司机第九色激情| 久久久女女女女999久久| 91丝袜美腿美女视频网站| 国产成人在线一区二区| 98精品国产高清在线xxxx天堂| 黄色成人av网| 亚洲男人天堂2019| 欧美三级免费观看| 91国内在线视频| 一区二区三区国产在线观看| 亚洲电影免费观看| 国产成人av在线播放| 亚洲女性裸体视频| 国产一区二区三区精品久久久| 精品久久久久久久久久久| 久久久成人的性感天堂| 久久久精品免费| 久久精品国产亚洲精品| 日韩在线观看网站| 欧美黑人狂野猛交老妇| 亚洲福利在线观看| 欧美日韩激情视频8区| 91精品国产综合久久久久久久久| 高清欧美性猛交xxxx| 91系列在线播放| 欧美亚洲伦理www| 欧美亚洲伦理www| 大伊人狠狠躁夜夜躁av一区| 91精品国产一区| 亚洲国产精品福利| xxxx性欧美| 26uuu另类亚洲欧美日本一| 亚洲精品中文字幕av| 国产脚交av在线一区二区| 91久久久国产精品| 亚洲视频综合网| 成人性生交大片免费看视频直播| 欧美激情2020午夜免费观看| 中文字幕久热精品视频在线| 欧美激情精品久久久久久大尺度| 精品国产91乱高清在线观看| 欧美第一黄网免费网站| 中文字幕视频在线免费欧美日韩综合在线看| 日韩成人在线观看| 亚洲影院在线看| 国产成人高潮免费观看精品| 国产精品99免视看9| 亚洲黄页网在线观看| 国产精品久久久久aaaa九色| 91免费福利视频| 欧美日韩国产一区二区三区| 国产福利精品视频| 国产综合视频在线观看| 国产亚洲欧洲在线| 色综合色综合久久综合频道88| 精品国产一区久久久| 欧美性videos高清精品| 亚洲一区二区三区四区视频| 在线观看欧美日韩国产| 国产精品国模在线| 2019国产精品自在线拍国产不卡| 91亚洲精华国产精华| 欧美高清视频免费观看| 日本午夜在线亚洲.国产| 久久99亚洲热视| 91影视免费在线观看| 国产一区二区丝袜高跟鞋图片| 国产视频久久网| 亚洲精品福利视频| 亚洲精品国产精品自产a区红杏吧| 在线免费观看羞羞视频一区二区| 国产精品久久激情| 97精品一区二区视频在线观看| 久久久999精品| 亚洲欧洲国产伦综合| 国产精品爽爽爽| 国产精品美女久久久久av超清| 欧美黑人一级爽快片淫片高清| 国产91热爆ts人妖在线| 一级做a爰片久久毛片美女图片| www.国产精品一二区| 色天天综合狠狠色| 91亚洲精品一区二区| 日本国产精品视频| 91精品国产色综合久久不卡98| 成人免费高清完整版在线观看| 欧美日韩aaaa| 成人网在线免费看| 国产精品老女人精品视频| 久久久免费电影| 国产精品视频最多的网站| 国产成人福利视频| 亚洲第一av网站| 日韩av电影手机在线| 欧美xxxx14xxxxx性爽| 午夜精品久久久久久久男人的天堂| 欧美视频免费在线观看| 91av在线免费观看视频| 欧美第一黄色网| 日韩三级成人av网| 精品久久久久国产| 亚洲男女性事视频| 国产精品精品久久久久久| 久久久久久18| 成人性生交大片免费看小说| 91精品国产高清久久久久久久久| 亚洲精品ady| 亚洲大胆美女视频| 中国日韩欧美久久久久久久久| 成人福利在线观看| 日本一区二三区好的精华液| 91九色国产视频| 日韩av手机在线观看| 亚洲深夜福利网站| 91免费精品视频| 中文字幕欧美视频在线| 久久精品中文字幕电影| 欧美性开放视频| 97久久精品人搡人人玩| 亚洲精品美女久久久| 91精品国产91久久久久久不卡| 国产在线播放91| 色综合色综合网色综合| 91精品视频在线看| 亚洲人成绝费网站色www| 欧美老女人www| 日韩**中文字幕毛片| 日韩免费在线观看视频| 亚洲欧洲在线观看| 中文字幕国产亚洲2019| 国产成人福利夜色影视| 色综合天天狠天天透天天伊人| 精品美女国产在线| 中文精品99久久国产香蕉|