sqlite触发器使用

时间:2024-03-18 18:48:09

sqlite触发器跟mysql中的一样,都是在增删改操作发生时可以自动执行的一些命令集合。参考前一篇mysql触发器介绍:https://blog.csdn.net/talkingmute/article/details/104372711

相比mysql,sqlite是多了WHEN 子句,就是针对 WHEN 子句为真的指定行执行 SQL 语句。如果没有提供 WHEN 子句,则针对所有行执行 SQL 语句。

sqlite里有个系统表sqlite_master,里面存放了当前数据库的表、视图、索引、触发器等各种信息。通过type字段可以区分。

举例,有2张表,student和stu_log日志表,.schema 表名,可以查看表的结构。还有如下2个触发器:

sqlite触发器使用

sqlite> select * from sqlite_master where type='trigger'; #从sqlite_master系统表,打印出当前的触发器
type    name    tbl_name        rootpage        sql
trigger stu_updaft_trig student 0       CREATE TRIGGER stu_updaft_trig after update on student
begin
insert into stu_log(opname,optime,opinfo) values('update',datetime('now','localtime'),'更新前: '||old.name||' '||old.age||' '||old.class||' 更新后:'||new.name||' '||new.age||' '||new.class); #sqlite中字符串连接没有mysql中的concat函数,可以用||替代。
end
trigger stu_updbef_trig student 0       CREATE TRIGGER stu_updbef_trig before update on student for each row
when new.age>100
begin
insert into stu_log(opname,optime,opinfo) values('update',datetime('now','localtime'),'更新数据非法: '||'age='||new.age);
end

2个触发器,一个是在update操作之前,使用了when语句,当age大于100时,进行在stu_log日志表的插入操作,记录数据非法。一个是在update操作之后,把更新前后的数据插入stu_log日志表。

测试执行如下:

sqlite触发器使用