Fork me on GitHub
0%

sqlite

简介

sqlite中文网站:https://www.sqlite.net.cn/

SQLite是一种C语言库,它实现了一个 小型、快速、自包含、高可靠性, 功能齐全的SQL数据库引擎。SQLite是世界上最常用的数据库引擎,广泛应用于嵌入式领域。

与大多数其他SQL数据库不同,SQLite没有单独的服务器进程。SQLite直接读取和写入普通磁盘文件。具有多个表,索引,触发器和视图的完整SQL数据库包含在单个磁盘文件中。

Shell命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 创建数据库
# sqlite3 test.db

// 查询数据库
# .database

//创建表格
# CREATE TABLE user(Id integer PRIMARY KEY, name text);

//查询表格
# .tables

// 插入数据
# INSERT INTO user VALUES(1, '小张');
# INSERT INTO user VALUES(2, '小陈');

// 查询数据(一定要有分号)
# select * from user;

// 退出命令行环境
# .quit / .exit

// 显示数据库结构
# .schema

约束

约束就是用来进一步描述每一列数据属性的。

非空 NOT NULL

有一些字段我们可能一时不知到该填些什么,同时它也没设定默认值, 当添加数据时,我们把这样的字段空着不填,系统认为他是 NULL 值。但是还有另外一类字段,必须被填上数据,如果不填,系统就会报错。 这样的字段被称为 NOT NULL 非空字段,需要在定义表的时候事先声明。

唯一 UNIQUE

除了主列以外,还有一些列也不能有重复值。

主键 PRIMARY KEY

一般是整数或者字符串,只要保证唯一就行。 在 SQLite 中,主键如果是整数类型,该列的值可以自动增长。

外键 FOREIGN KEY

我们的数据库中已经有 Teachers 表了,假如我们再建立一个 Students 表, 要求 Students 表中的每一个学生都对应一个 Teachers 表中的教师。 很简单,只需要在 Students 表中建立一个 TeacherId 字段,保存对应教师的 Id 号, 这样,学生和教师之间就建立了关系。 问题是:我们有可能给学生存入一个不在 Teachers 表中的 TeacherId 值, 而且发现不了这个错误。 这种情况下,可以把 Students 表中 TeacherId 字段声明为一个外键, 让它的值对应到 Teachers 表中的 Id 字段上。 这样,一旦在 Students 表中存入一个不存在的教师 Id ,系统就会报错。

默认值 DEFAULT

有一些特别的字段列,在每一条记录中,他的值基本上都是一样的。只是在个别情况下才改为别的值,这样的字段列我们可以给他设一个默认值。

条件检查 CHECK

某些值必须符合一定的条件才允许存入,这是就需要用到这个 CHECK 约束。

VFS在linux下架构图

Linux系统的User使用GLIBC(POSIX标准、GUN C运行时库)作为应用程序的运行时库,然后通过操作系统,将其转换为系统调用SCI(system-call interface),SCI是操作系统内核定义的系统调用接口,这层抽象允许用户程序的I/O操作转换为内核的接口调用。VFS提供了一个抽象层,将POSIX API接口与不同存储设备的具体接口实现进行了分离,使得底层的文件系统类型、设备类型对上层应用程序透明。

在这里插入图片描述

sqlite3 vfs

API:https://www.sqlite.net.cn/cintro.html

1
2
3
4
// 注册一个VFS系统,支持多个创建通过第二个参数使能
# sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt)
// 使用demo vfs替换默认的vfs
# sqlite3_open_v2("demo.db", &db, SQLITE_OPEN_READWRITE, "demo");

参考资料

一文搞懂嵌入式数据库sqlite3