您的位置:首页 > 数据库

sqlite编程心得

2015-11-19 08:35 357 查看

1. 应用场景

SQLite(sqlite3)数据库是个文件,又有数据库操作的接口,所以某些场景用起来特别方便。

就我的使用感受, sqlite3特别适合应用于单进程来操作数据,缓存中间数据,并且数据库大小有上限,建议1G之内。

在内部,SQLite由以下几个组件组成:内核、SQL编译器、后端以及附件。SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展SQLite的内核变得更加方便。所有SQL语句都被编译成易读的、可以在SQLite虚拟机中执行的程序集。SQLite支持大小高达2 TB的数据库,每个数据库完全存储在单个磁盘文件中。这些磁盘文件可以在不同字节顺序的计算机之间移动。这些数据以B+树(B+tree)数据结构的形式存储在磁盘上。SQLite根据该文件系统获得其数据库权限。



相关文档详见http://www.sqlite.org/

2. 操作

例如centos 6.3上创建数据库test.db,里面有一个表tb_report。
CREATE TABLE tb_report (
id INTEGER PRIMARY KEY AUTOINCREMENT,
time TIMESTAMP NOT NULL DEFAULT '1972-01-01 00:00:00',
user_id INTEGER NOT NULL,
total_volume INTEGER NOT NULL DEFAULT 0,
creationdate TIMESTAMP default CURRENT_TIMESTAMP
);
CREATE INDEX idx_report_user_id ON tb_report(user_id);


自增ID

INTEGER是64位,所以是够用的。

自增id定义为“PRIMARY KEY AUTOINCREMENT",虽然定义为"PRIMARY KEY"也可以自增,但是当"delete from tb_report"操作之后,又开始从1自增了。

INSERT

对于自增id插入NULL。
insert into tb_report (id, time, user_id , total_volume ) Values(NULL, '2015-11-18 09:17:18', 10001, 389836235);


DELETE
delete from tb_report;
sqlite没有truncate table命令,"delete from tb_report;"不加where, 相当于 truncate table. 

delete操作不会使数据库文件减少,而是标记一下,被新插入的数据使用,想减少数据库大小,需要做数据库整理。



3. 限制

http://www.sqlite.org/limits.html

sqlite3有默认限制SQLITE_MAX_SQL_LENGTH=1000000, SQLITE_MAX_COMPOUND_SELECT=500.

所以当在一个insert里面插入多个value时候,不要超过这个限制,不然会报错。

若你想修改这些限制,需要自己编译安装。

4. 数据库整理

VACUUM 命令通过复制主数据库中的内容到一个临时数据库文件,然后清空主数据库,并从副本中重新载入原始的数据库文件。这消除了空闲页,把表中的数据排列为连续的,另外会清理数据库文件结构。

下面是在命令提示符中对整个数据库发出 VACUUM 命令的语法:
$sqlite3 test.db "VACUUM;"
您也可以在 SQLite 提示符中运行 VACUUM,如下所示:
sqlite> VACUUM;
您也可以在特定的表上运行 VACUUM,如下所示:
sqlite> VACUUM tb_report;

5. 数据库修复

若数据库文件遭到损坏,client使用会提示:sqlite3 disk image malformat

修复方式是将原来的数据库导出为sql语句,创建新的数据库导入sql。
$sqlite3 test.db
sqlite>.output test.sql
sqlite>.dump
sqlite>.quit
$mv test.db test.db.bak
$sqlite3 test.db
sqlite>.read test.sql
sqlite>.quit



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sqlite vacuum