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

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:

Commit Transaction:

Rollback Transaction:

复制代码 代码如下:

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

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

复杂查询情况下对查询效率的测试结果如下(~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 的触发器(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 库中包含了一个SQLite3.exe 的命令行工具,它可以实现SQLite 各项基本操作。这里只介绍一下如何使用它来分析我们的查询结果:

1. CMD->sqlite3.exe MySQLiteDbWithoutIndex.s3db

2. 开启EXPLAIN 功能并分析指定查询结果

3. 重新使用命令行打开一个有索引的数据库并执行前两步

4. 通过比较两个不同查询语句的分析结果,我们可以发现如果查询过程中使用了索引,SQLite 会在detail 列中提示我们。

5. 要注意的是每条语句后面都要加分号“;”

SQLite一些常见的使用限制

1. SQLite 不支持Unicode 字符的大小写比较,请看以下测试结果:

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据库
, 引擎
sqlite数据库
数据库引擎 管理系统、数据库引擎、数据库引擎找不到对象、mysql 查看数据库引擎、mysql数据库引擎,以便于您获取更多的相关知识。

时间: 2024-10-31 04:21:43

SQLite数据库管理系统-我所认识的数据库引擎_SQLite的相关文章

SQLite数据库安装及基本操作指南_SQLite

1. 介绍 SQLite 是一个开源的嵌入式关系数据库,实现自包容.零配置.支持事务的SQL数据库引擎. 其特点是高度便携.使用方便.结构紧凑.高效.可靠. 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下 - 只要确保SQLite的二进制文件存在即可开始创建.连接和使用数据库.如果您正在寻找一个嵌入式数据库项目或解决方案,SQLite是绝对值得考虑. 2. 安装 SQLite on Windows 1)进入 SQL 下载页面:http://www.sqlite.or

空间地理技术与数据库管理系统

数据|数据库 地理问题正成为我们日常生活中一个日益重要的组成部分.无论在航空航天等尖端技术领域,还是在农业.能源.交通.金融.电信.零售等传统商业领域,空间地理技术正在扮演着越来越重要的角色.随着以计算机为基础的空间地理信息的潜力不断扩大,大量的人力与物力投入到空间地理技术的研究中,这也促使人们创建基于地理数据存储的数据库管理系统.但直到1981年具有突破性意义的第一个商用地理信息产品ARC/INFO面世,人们才开始真正有效地将空间地理技术和数据库集成于一个单一的系统中. 空间地理技术蓬勃兴起

浅谈数据库管理系统在近些年内的发展趋势

数据库管理系统在近些年内的发展趋势: 1. 用户界面的改进.这方面,也许MS依靠自己操作系统的优势,做得最让普通用户能够接受.但是,别的商用数据库,真的让人不敢苟同.目前,DB2, Oracle, Sybase都在用户界面上下了不少功夫. 2. 特色化发展.以Sybase为例,它将IQ剥离出来,专门用做智能型数据仓库应用,无论是性能还是价格都占了很大的优势.DB2则走的是融合的路子,将XMLDB的引擎直接合入到DB2 V9里边.即同时支持两种存储引擎. 3.超微型发展.手持设备上的数据库(移动数

细化解析数据库管理系统的层次安全技术

数据库系统的安全性很大程度上依赖于数据库管理系统.如果数据库管理系统安全机制非常强大,则数据库系统的安全性能就较好.目前市场上流行的是关系式数据库管理系统,其安全性功能很弱,这就导致数据库系统的安全性存在一定的威胁. 由于数据库系统在操作系统下都是以文件形式进行管理的,因此入侵者可以直接利用操作系统的漏洞窃取数据库文件,或者直接利用OS工具来非法伪造.篡改数据库文件内容.这种隐患一般数据库用户难以察觉,分析和堵塞这种漏洞被认为是B2级的安全技术措施. 数据库管理系统层次安全技术主要是用来解决这一

Valentina Database 4.9发布 数据库管理系统

Valentina是一款跨平台的数据库管理系统,能够更容易的在本地嵌入式数据库与相同的服务器源码之间切换.它支持磁盘和储存数据库,并且从Bit到BLOB的字段类型都是SQL92(99)和非SQL API.Valentina同样也支持相关性的扩展导航和对象关联的http://www.aliyun.com/zixun/aggregation/14208.html">数据模型.它引入了一个革命性的抽象模式的""Link"".能够在UTF - 16运作,接受

OrientDB 1.0rc4发布 非关系型的数据库管理系统

OrientDB是一个开源的非关系型的数据库管理系统,它在使用一般硬件下,可以每秒15万个文件的速度和容量来存储.它使用Java编写,属于文档形数据库,支持ACID Tx,http://www.aliyun.com/zixun/aggregation/16666.html">Indexes,asynch queries,SQL layer,clustering等等,支持 ACID 事务处理.使用 Java 5 来实现. OrientDB是兼具文挡数据库的灵活性和图形数据库管理链接能力的可深

MariaDb数据库管理系统学习(一)安装过程图解

MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险. MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品.在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB. MariaDB由MySQL的创始人Michael Widenius(英语:Michael Wid

使用SQLite数据库和Access数据库的一些经验总结

在我的<Winform开发框架>中,可使用多种数据库作为程序的数据源,除了常规的Oracle数据库.SqlServer.MySql数据库,其中还包括了SQLite数据库.Access数据库,后两个数据库都是在单机版程序中常用到的数据库,各自有着自己的特点,在我的<Winform开发框架>的提炼和多个项目的反复使用过程中,对SQLite数据库.Access数据库的一些特点进行了一些总结,以期达到常用常新,避免走弯路的目的. 1.简化数据库的地址,使用|DataDirectory|代替

数据库之父对实现关系型数据库管理系统的12条建议

数据|数据库 这是数据库之父对实现关系型数据库管理系统的12条建议: Codd's 12 Rules  Dr. E.F. Codd, an IBM researcher, first developed the relational data model in 1970. In 1985, Dr. Codd published a list of 12 rules that concisely define an ideal relational database, which have pro