开发者学堂课程【嵌入式之 RFID 开发与应用2020版:SQLite 虚拟表和触发器操作联结表】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/665/detail/11233
SQLite 虚拟表和触发器操作联结表
内容介绍:
一、视图(虚拟的表)
二、触发器
一、视图(虚拟的表)
注意:虚拟表在严格意义上不能说是一种表,它是提供了一种查看表的方法。
举例:sqlite> select info.id,info.name, info.addr , score from info,class where info.id=class.id;
id name addr score
---- -------- ------- ------
101 zs bj 40
102 ls tj 40
103 ww sh 60
104 zs cd 60
105 sw cq 90
106 xh hb 90
107
发现上述写的查看代码非常长,如果觉得太过复杂,可以在 select 代码前面加上create view result(表名)as,result 就是一个虚拟的表,显示的是一串联结表的信息。
如果要再查看联结表信息,可以:
sqlite> select * from result;
id name addr score
---- -------- ------- ------
101 zs bj 40
102 ls tj 40
103 ww sh 60
104 zs cd 60
105 sw cq 90
106 xh hb 90
107
以上方法只适合进行查看,不能进行修改。
创建视图: 视图不包含数据,因此在每次使用视图时,实际上都必须执行查询语句,从返回结果信息中再检索视图与表一样,必须唯一命名(通过 .tables 和 .schema 查看)
语法 :create view 视图名 as 语句;
创建视图后,视图名可以作为一个表来使用
更改视图后,视图重新检索出的数据排序
删除视图: 语法: drop view 视图名;
总结:
1、视图不包含数据,因此在每次使用视图时,实际上都必须执行查询语句
2、视图相当于创建视图的时候as后面SQL语句查询得到的结果集合。
3、从返回结果信息(视图)中再检索视图与表一样
二、触发器
1.概念
SQLite 的触发器是数据库的回调函数,它会在指定的数据库事件发生时自动执行调用。
(1)只有每当执行 delete,insert 或 update 操作时,才会触发,并执行指定的一条或多条 SQL 语句。
例如: 可以设置触发器,当删除 persons 表中 lucy 的信息时,自动删除 grade 表中与 lucy 相关的信息
(2)触发器常用于保证数据一致,以及每当更新或删除表时,将记录写入日志表
触发器是数据库中非常灵活的操作,使得数据库插上翅膀,比如物联网中用到的实时数据库,如果要用普通数据库达到实时数据库的效果,可以通过触发器实现一部分效果。
2.创建触发器
语法:
create trigger 触发器名 [before]after]
[insert|update]delete] on 表名
Begin 语句; end;
Begin 和 end 之间就是触发的内容
例如: create trigger tg_delete after delete on persons begin
delete from grade where id=old.id;
end;
说明: 当执行: delete from persons where id=1l; 语句时,事件触发,执行 begin 与 end 之间的 SQL 语句(即回调函数)
注意:
old.id 等价于 persons.id,但此处不能写 persons.id,old.id 代表删除行的 id(id 代表两个表的关联列)
举例:以下是两张表,假如删除第一张表里的某个学生信息。
sqlite> select * from info;
id name addr
---- -------- -------
101 zs bj
102 ls tj
103 ww sh
104 zs cd
105 sw cq
106 xh hb
107
sqlite> select * from class;
id score year
---- -------- -------
101 40
102 40
103 60
104 60
105 90
106 90
107
/创建触发器
sqlite> create trigger tg_del after delete on info begin delete from class where id=old.id;end;
sqlite> schema
CREATE TABLE info(id INT , name text, addr text) ;
CREATE TABLE class(id INT, score INT , year text) ;
CREATE TRIGGER tg_del after .delete on info begin delete from class where id=old.id;end;
sqlite> delete from info where id=106;
sqlite> select * from info;
id name addr
---- -------- -------
101 zs bj
102 ls tj
103 ww sh
104 zs cd
105 sw cq
107
sqlite> select * from class;
id score year
---- -------- -------
101 40
102 40
103 60
104 60
105 90
107
以上就是触发器的写法,但触发器的写法并不是都一样。
比如:更新,更新一般是针对相同内容进行修改。
举例:假如更改某个学生的id
sqlite> create trigger tg_up after update on info begin update class set id=new.id where id=old.id;end;
sqlite> .shcema
CREATE TABLE info(id INT , name text, addr text) ;
CREATE TABLE class(id INT, score INT , year text) ;
CREATE TRIGGER tg_del after .delete on info begin delete from class where id=old.id;end;
CREATE TRIGGER tg_up after update on info begin update class set id=new.id where id=old.id;
sqlite>update info set id=110 where id=103;
sqlite> select * from info;
id name addr
---- -------- -------
101 zs bj
102 ls tj
110 ww sh
104 zs cd
105 sw cq
107
sqlite> select * from class;
id score year
---- -------- -------
101 40
102 40
110 60
104 60
105 90
107
在触发器中,begin 后的内容是任意的。触发器还有一个经典的应用是日志操作。