sqlite是嵌入式sql数据库引擎sqlite(sqlite Embeddable sql Database Engine)的一个扩展。sqlite是一个实现嵌入式sql数据库引擎小型C语言库(C library),实现了独立的,可嵌入的,零配置的sql数据库引擎。 特性包括:事务 *** 作是原子,一致,孤立,并且持久的,即使在系统崩溃和电源故障之后。零配置——不需要安装和管理。 实现了绝大多数sql92标准。整个数据库存储在一个单一的文件中。数据库文件可以在不同字节序的机器之间自由地共享。支持最大可达2T的数据库。字符串和BLOB类型的大小只受限于可用内存。完整配置的少于250KB,忽略一些可选特性的少于150KB。在大多数常见 *** 作上比流行的客户/服务器数据库引擎更快。 简单易于使用的API。 内建TCL绑定。另外提供可用于许多其他语言的绑定。具有良好注释的源代码,代码95%有较好的注释。 独立:没有外部依赖。源代码位于公共域,可用于任何用途。用 sqlite连接的程序可以使用sql数据库,但不需要运行一个单独的关系型数据库管理系统进程(separate RDBMS process)。 sqlite不是一个用于连接到大型数据库服务器(big database server)的客户端库(clIEnt library),而是非常适合桌面程序和小型网站的数据库服务器。sqlite直接读写(reads and writes directly)在硬盘上的数据库文件。 sqlite的官方主站:http://www.sqlite.org/ sqlite的中文网:http://sqlitecn.feuvan.net/index.html http://www.sqlite.com.cn/ OTL的官方主站:http://otl.sourceforge.net/home.htm 下面是我自己的使用过程: 一、sqlite-3.6.6安装 sqlite的最新版本可以从这里下载(http://www.codepub.com/d/tag.php?n=1&tag=SQLite)。下面我们以windows版本sqlite 3.6.6 For windows.rar 为例介绍其安装方法。 (大家可以选择下载安装适合自己的版本) 下载后,将sqlite 3.6.6 For windows.rar解压缩至E:\Program files\sqlite目录即完成安装。 E:\Program files\sqlite目录构造为: E:\Program files\sqlite | +--sqlite3.exe 打开一个CMD命令窗口 C:\documents and Settings\new>e: E:\>cd E:\Program files\sqlite 创建一个新的数据库文件名叫"mydb.db" (当然你可以使用不同的名字) 来测试数据库 E:\Program files\sqlite>sqlite3.exe mydb.db 如果出现下面字样表明编译安装已经成功了. sqlite version 3.6.6 Enter ".help" for instructions sqlite> 二 、sqlite的基本语法 2.1 新建一个数据库 例如我们想新建一个数据库命名为 mydb.db ,可以直接在sqlite>下输入 sqlite3 mydb.db , 前提是:先进放sqlite的安装文件夹下然后执行下面的 *** 作: E:\Program files\sqlite>sqlite3 mydb.db sqlite version 3.6.6 Enter ".help" for instructions sqlite> 这里 sqlite version 3.6.6 是sqlite的版本信息。也就是说本文使用的sqlite版本为 version 3.6.6 . 这样就创建了一个新的数据库文件,命名为 mydb.db 2.2 创建表和插入值 我们创建了一个新的数据库 mydb.db,加入我们想在其中新建一个名为 user 的表,其包含3个列元素。 可以用CREATE table语法命令。 CREATE table语句基本上就是"CREATE table"关键字后跟一个新的表名以及括号内的一堆定义和约束。表名可以是字符串或者标识符。以"sqlite_"开头的表名是留给sqlite数据库引擎使用的。每个字段的定义是字段名后跟字段的数据类型,接着是一个或多个的字段约束。字段的数据类型并不限制字段中可以存放的数据。更多信息,参见sqlite的CREATE table语法。 sqlite> create table user( ...> ID integer primary key, ...> name varchar(32), ...> time VARCHAR(12) ...> ); 注意sqlite下除了特殊命令都要以分号 “;” 结尾,否则它将一直等待第一个分号的出现才判断这条命令结束。 现在我们可以用 schema 命令看看我们刚刚创建的表。具体作法如下: sqlite> .schema CREATE table user( ID integer primary key, name varchar(32), time VARCHAR(12) ); sqlite> .schema 是用来查看数据库中所有的表的定义内容。如果后面跟了具体的表名称,则显示该表的内容。 假如我们想想SensorData表中插入具体列元素值,该怎么办呢?这里可以用INSERT语句。 INSERT语句有两种基本形式。一种带有"VALUES"关键字,在已有表中插入一个新的行。若不定义字段列表,那么值的数目将与表中的字段数目相同。否则值的数目须与字段列表中的字段数目相同。不在字段列表中的字段被赋予缺省值或NulL(当未定义缺省值)。 INSERT的第二种形式从SELECT语句中获取数据。若未定义字段列表,则从SELECT得到的字段的数目必须与表中的字段数目相同,否则应与定义的字段列表中的字段数目相同。SELECT的每一行结果在表中插入一个新的条目。SELECT可以是简单的或者复合的。如果SELECT语句带有 ORDER BY子句,ORDER BY会被忽略。 这里我们可以这样做: 1) 插入数据: sqlite> INSERT INTO "user" VALUES(1,'u1','201001041414'); sqlite> INSERT INTO "user" VALUES(2,'u2','201001041415'); INSERT INTO "user" VALUES(3,'201001041415'); INSERT INTO "user" VALUES(4,'201001041415'); INSERT INTO "user" VALUES(5,'201001041415'); INSERT INTO "user" VALUES(6,'201001041415'); INSERT INTO "user" VALUES(7,'201001041415'); INSERT INTO "user" VALUES(8,'201001041415'); INSERT INTO "user" VALUES(9,'201001041415'); 2) 查询数据: sqlite> select * from user; //select数据分页用limit就行,很方便 select * from user limit 2,5; 3) 删除数据: sqlite> delete from user where ID = 1; 3) 修改数据(更新数据): sqlite> update user set name = 'u22' where ID = 2; 2.3 在线帮助 我们已经知道了sqlite语法最基本的用法。下面可以看看如何获得联机帮助。 很简单,输入 .help 就行了。注意要help前加上“.”,这与上面说的以分号结尾有点不同,因为help命令被视为特殊命令。 sqlite> .help 这里看到的命令都带有“.”开头,或者说sqlite下,只有这些命令是需要带“.”的。我们会经常用到的命令有: .output filename .output stdout .quit .read filename .schema ?table? .dump ?table? ... .echo ON|OFF .exit 2.4 查看当前数据库下的所有表 当数据库越来越大时,我们也许并不太记得数据库中有多少个表了,这时就需要查看当前数据库下的有些什么表。 我们可以用 .tables 命令 。 sqlite> .tables 2.5 退出sqlite3 安全退出有两个命令:.exit 和 .quit好了,我们已经新建一个名为zIEckey.db的数据库,并在其中新建一个名为 SensorData 的表. 现在我们想退出,那么可以用到刚刚提到的 .exit 和 .quit 命令。 例如我们可以这样退出: sqlite> .exit 这里需要说明一下,如果不是用 .exit 和 .quit 这两个命令退出,我们对数据库的修改有可能丢失。 sqlite>.quit 退出后,查看E:\Program files\sqlite>目录,会发现多出一个mydb.db文件: E:\Program files\sqlite | +--sqlite3.exe +--mydb.db sqlite性能优化: 很多人直接就使用了,并未注意到sqlite也有配置参数,可以对性能进行调整。有时候,产生的结果会有很大影响。 主要通过pragma指令来实现。 比如: 空间释放、磁盘同步、Cache大小等。 不要打开。前文提高了,Vacuum的效率非常低! PRAGMA auto_vacuum; PRAGMA auto_vacuum = 0 | 1; 查询或设置数据库的auto-vacuum标记。 正常情况下,当提交一个从数据库中删除数据的事务时,数据库文件不改变大小。未使用的文件页被标记并在以后的添加 *** 作中 再次使用。这种情况下使用VACUUM命令释放删除得到的空间。 当开启auto-vacuum,当提交一个从数据库中删除数据的事务时,数据库文件自动收缩, (VACUUM命令在auto-vacuum开启的数据库中不起作用)。数据库会在内部存储一些信息以便支持这一功能,这使得 数据库文件比不开启该选项时稍微大一些。 只有在数据库中未建任何表时才能改变auto-vacuum标记。试图在已有表的情况下修改不会导致报错。 建议改为8000 PRAGMA cache_size; PRAGMA cache_size = Number-of-pages; 查询或修改sqlite一次存储在内存中的数据库文件页数。每页使用约1.5K内存,缺省的缓存大小是2000. 若需要使用改变大量多行的UPDATE或DELETE命令,并且不介意sqlite使用更多的内存的话,可以增大缓存以提高性能。 当使用cache_size pragma改变缓存大小时,改变仅对当前对话有效,当数据库关闭重新打开时缓存大小恢复到缺省大小。 要想永久改变缓存大小,使用default_cache_size pragma. 打开。不然搜索中文字串会出错。 PRAGMA case_sensitive_like; PRAGMA case_sensitive_like = 0 | 1; liKE运算符的缺省行为是忽略latin1字符的大小写。因此在缺省情况下'a' liKE 'A'的值为真。可以通过打开 case_sensitive_like pragma来改变这一缺省行为。当启用case_sensitive_like,'a' liKE 'A'为假而 'a' liKE 'a'依然为真。 打开。便于调试 PRAGMA count_changes; PRAGMA count_changes = 0 | 1; 查询或更改count-changes标记。正常情况下INSERT,UPDATE和DELETE语句不返回数据。当开启count-changes,以上语句返回一行含一个整数值的数据——该语句插入,修改或删除的行数。返回的行数不包括由触发器产生的插入,修改或删除等改变的行数。 PRAGMA page_size; PRAGMA page_size = bytes; 查询或设置page-size值。只有在未创建数据库时才能设置page-size。页面大小必须是2的整数倍且大于等于512小于等于8192。 上限可以通过在编译时修改宏定义sqlITE_MAX_PAGE_SIZE的值来改变。上限的上限是32768. 如果有定期备份的机制,而且少量数据丢失可接受,用OFF PRAGMA synchronous; PRAGMA synchronous = FulL; (2) PRAGMA synchronous = norMAL; (1) PRAGMA synchronous = OFF; (0) 查询或更改"synchronous"标记的设定。第一种形式(查询)返回整数值。 当synchronous设置为FulL (2),sqlite数据库引擎在紧急时刻会暂停以确定数据已经写入磁盘。 这使系统崩溃或电源出问题时能确保数据库在重起后不会损坏。FulL synchronous很安全但很慢。 当synchronous设置为norMAL,sqlite数据库引擎在大部分紧急时刻会暂停,但不像FulL模式下那么频繁。 norMAL模式下有很小的几率(但不是不存在)发生电源故障导致数据库损坏的情况。但实际上,在这种情况下很可能你的硬盘已经不能使用,或者发生了其他的不可恢复的硬件错误。 设置为synchronous OFF (0)时,sqlite在传递数据给系统以后直接继续而不暂停。若运行sqlite的应用程序崩溃,数据不会损伤,但在系统崩溃或写入数据时意外断电的情况下数据库可能会损坏。另一方面,在synchronous OFF时一些 *** 作可能会快50倍甚至更多。 在sqlite 2中,缺省值为norMAL.而在3中修改为FulL. 使用2,内存模式。 PRAGMA temp_store; PRAGMA temp_store = DEFAulT; (0) PRAGMA temp_store = file; (1) PRAGMA temp_store = MEMORY; (2) 查询或更改"temp_store"参数的设置。当temp_store设置为DEFAulT (0),使用编译时的C预处理宏 TEMP_STORE来定义储存临时表和临时索引的位置。当设置为MEMORY (2)临时表和索引存放于内存中。 当设置为file (1)则存放于文件中。temp_store_directorypragma 可用于指定存放该文件的目录。当改变temp_store设置,所有已存在的临时表,索引,触发器及视图将被立即删除。 转自http://hi.baidu.com/libaohui2009/blog/item/82fa732e6720182e1f3089a2.html |
评论列表(0条)