SQLite数据库管理体系-我所认识的数据库引擎

发布时间:2018-11-15  栏目:sqlite  评论:0 Comments

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”

  • “FROM Folder folder LEFT JOIN File file ON
    file.ParentGuid=folder.Guid”
    +”WHERE file.Length > 5000000 GROUP BY File.LeafName”;

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

你可能感兴趣的篇章:

  • 30
    个坏棒的PHP开源CMS内容管理体系总结
  • Swift中之Access
    Control权限控制介绍
  • php结合ACCESS的跨库查询功能
  • C#由此oledb访问access数据库的计
  • C#操作Access通用类实例
  • Apache服务器中.htaccess的中心配置总结
  • mysql Access denied for user ‘root’@’localhost’ (using password:
    YES)解决方式
  • Javascript连接Access数据库完整实例
  • Access转成为SQL数据库的法子
  • SQL
    Server数据复制到之Access两步走
  • Access创建一个简单MIS管理网

留下评论

网站地图xml地图