菜单

数据库管理体系

2018年11月16日 - sqlite

SQLite
是平等慢性轻量级的、被设计用来嵌入式系统的关联式数据库管理体系。SQLite
是一个兑现自身依赖、纯客户端、零配置且支持工作的数据库引擎。它由D.
Richard Hipp首不成开发,目前早就是世界上无与伦比常见部署的开源数据库引擎。

用户角度


本文中,我们拿介绍如下内容:

 

数据库(DB):相互有关统一关系之多少集合

数据库系统(DMBS):管理数据库的软件

数定义语言(DDL):对表的概念

数码操作语言(DML):对数据开展多、删、改、查

数据库控制语言(DCL):数据库控制语言,控制什么用户可以拜数据库中之多少

用户以SQL语言由此DBMS对数据库进行田间管理

始建一个SQLite 数据库

系角度


复制代码 代码如下:

 

产图由系统角度说了数据库管理网的做事历程

图片 1

 

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:

图片 2

Commit Transaction:

图片 3

Rollback Transaction:

图片 4

复制代码 代码如下:

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

SQLite 的索引

目是相同种用来优化查询的特点,在数据遭到分为聚簇索引和非聚簇索引;前者是由于数据库被数据组织方式控制的,比如我们在向数据库被相同长条一长条插入数据经常,聚簇索引能够保证按顺序插入,插入后数的职务以及布局不转移。非聚簇索引是据我们手动、显式创建的目,可以呢数据库中之每个列创建索引,和字典中之目类似,遵循的准是针对性发生分散性和组合型的排列建立目录,以有利于大数目与复杂性查询情况下增强查询效率。

图片 5

复制代码 代码如下:

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

复杂查询状况下对查询效率的测试结果如下(~40,000条数据):

复制代码 代码如下:

string sql = “SELECT folder.Location AS FilePath”

图片 6

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)

视图可以是一个虚拟表,里面可以储存按照一定条件过滤出来的数目集合,这样我们重下次想赢得这些特定数据集合的时候即便绝不通过复杂查询来得到,简单的查询指定视图就得获想只要之数据。

每当生单例中,我们创建一个略的视图:

图片 7

据悉上面的询问结果我们创建一个视图:

图片 8

SQLite 命令行工具

SQLite 库中含了一个SQLite3.exe 的命令行工具,它好实现SQLite
各项基本操作。这里只有介绍一下什么运用她来分析我们的查询结果:

  1. CMD->sqlite3.exe MySQLiteDbWithoutIndex.s3db

图片 9

  1. 开启EXPLAIN 功能并分析指定询问结果

图片 10

  1. 重复行使命令执行打开一个生出目录的数据库并施行前片步

图片 11

4.
经过比较有限只不等查询语句的剖析结果,我们好窥见只要查询过程被运用了目录,SQLite
会在detail 列中提拔我们。

  1. 若果注意的凡各条语句后面都使加分号“;”

SQLite一些广泛的行使范围

  1. SQLite 不支持Unicode 字符的深浅写于,请圈之下测试结果:

图片 12

  1. 怎样处理SQLite 转义字符:

复制代码 代码如下:

INSERT INTO xyz VALUES(‘5 O”clock’);

  1. 一致久复合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);
}
}

你或许感兴趣之章:

相关文章

标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图