设为首页 收藏本站
查看: 2091|回复: 0

[经验分享] YII sqlite win数据库安装和创建

[复制链接]

尚未签到

发表于 2016-11-30 11:20:21 | 显示全部楼层 |阅读模式
  开放源码嵌入式数据库 SQLite 简介

  SQLite 是 D. Richard Hipp 用 C
语言编写的开源嵌入式数据库引擎。它是完全独立的,不具有外部依赖性。它是作为 PHP V4.3 中的一个选项引入的,构建在 PHP V5
中。SQLite 支持多数 SQL92 标准,可以在所有主要的操作系统上运行,并且支持大多数计算机语言。SQLite
还非常健壮。其创建者保守地估计 SQLite 可以处理每天负担多达 100,00 次点击率的 Web 站点,并且 SQLite 有时候可以处理
10 倍于上述数字的负载。
  功能



SQLite 对 SQL92 标准的支持包括索引、限制、触发和查看。SQLite 不支持外键限制,但支持原子的、一致的、独立和持久 (ACID) 的事务(后面会提供有关 ACID 的更多信息)。

这意味着事务是原子的 ,因为它们要么完全执行,要么根本不执行。事务也是一致的 ,因为在不一致的状态中,该数据库从未被保留。事务还是独立的 ,所以,如果在同一时间在同一数据库上有两个执行操作的事务,那么这两个事务是互不干扰的。而且事务是持久性的 ,所以,该数据库能够在崩溃和断电时幸免于难,不会丢失数据或损坏。

SQLite 通过数据库级上的独占性和共享锁定来实现独立事务处理。这意味着当多个进程和线程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程向数据库执行写入操作之前,必须获得独占锁定。在发出独占锁定后,其他的读或写操作将不会再发生。
  SQLite 网站上记录了完整的 SQLite locking semantics

  windows安装

  官方网站下载 http://www.sqlite.org/

  直接解压就可以看到一个sqlite3.exe文件 A command-line shell for accessing and modifying SQLite databases.
  一、创建数据库:

  环境:把数据库解压在的的d:\sqlite文件夹下
  实验一:创建数据库 架设school(以后将都按照这个数据库来介绍sqlite学习)
  1、“开始->运行->cmd"
DSC0000.png
  2、创建命令:d:\sqlite\sqlite3 <路径>+数据库名称   sqlite "E:\Apache2\htdocs\test\protected\runtime\cache-1.1.8.db" 备注:数据库名优特殊的扩展名
 
DSC0001.jpg
  然后查看c:\users\caizhimin\有一个school的文件,新建完以后并选择此数据库
  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)
);
  
.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');
INSERT INTO "user" VALUES(2, 'u2', '201001041415');
INSERT INTO "user" VALUES(3, 'u2', '201001041415');
INSERT INTO "user" VALUES(4, 'u2', '201001041415');
INSERT INTO "user" VALUES(5, 'u2', '201001041415');
INSERT INTO "user" VALUES(6, 'u2', '201001041415');
INSERT INTO "user" VALUES(7, 'u2', '201001041415');
INSERT INTO "user" VALUES(8, 'u2', '201001041415');
INSERT INTO "user" VALUES(9, 'u2', '201001041415');
  2) 查询数据:

sqlite> select * from user;
//select数据分页用limit就行,很方便
select * from user limit 2,5;
  3) 删除数据:

sqlite> delete from user where id = 1; 
  4) 修改数据(更新数据):

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 抓出数据库中所有的表


.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文件:
  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设置,所有已存在的临时表,索引,触发器及视图将被立即删除。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-307685-1-1.html 上篇帖子: 【转载】Using SQLite from Shell in Android(在shell 下使用sqlite命令操作数据库) 下篇帖子: android开发之sqlite数据库升级
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表