SQLite基础学习 互动版

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

说明:

  SQLite 的触发器 是数据库的回调函数,它会自动执行/指定的数据库事件发生时调用

要点:

  1. SQLite 的触发器(Trigger)可以指定在特定的数据库表发生 DELETE、INSERT 或 UPDATE 时触发,或在一个或多个指定表的列发生更新时触发。
  2. SQLite 只支持 FOR EACH ROW 触发器(Trigger),没有 FOR EACH STATEMENT 触发器(Trigger)。因此,明确指定 FOR EACH ROW 是可选的。
  3. WHERE 子句和触发器(Trigger)动作可能访问使用表单 NEW.column-name 和 OLD.column-name 的引用插入、删除或更新的行元素,其中 column-name 是从与触发器关联的表的列的名称。
  4. 如果提供 WHERE 子句,则只针对 WHERE 子句为真的指定行执行 SQL 语句。如果没有提供 WHERE 子句,则针对所有行执行 SQL 语句。
  5. BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。
  6. 当触发器相关联的表删除时,自动删除触发器(Trigger)。
  7. 要修改的表必须存在于同一数据库中,作为触发器被附加的表或视图,且必须只使用 tablename,而不是 database.tablename。
  8. 一个特殊的 SQL 函数 RAISE() 可用于触发器程序内抛出异常。


  假设有如下表student:

sqlite> select * from student;
ID          NAME        AGE         ADDRESS
----------  ----------  ----------  ----------
1           xiaoming    18          shenzhen
2           xiaohua     18          beijing
3           mingming    19          shanghai
4           xiaogang    20          hangzhou
5           honghong    17          shenzhen
6           liangliang  21          wuhan
7           tingting    23          shenzhen

触发器语法:

CREATE  TRIGGER trigger_name [BEFORE|AFTER] event_name 
ON table_name
BEGIN
 -- Trigger logic do something .... 
END;

实例:

  做一个触发器,每次删除一条记录时,往表delete_log插入一条数据:   先创建表delete_log:

sqlite>create table delete_log(
ID INT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);

  再创建触发器:

sqlite>create trigger student_log after delete
on student
begin
--这里的old表示操作之前, 也可以为new,表示操作之后
insert into delete_log values(old.ID, datetime('now')); -- 删除之后就往表delete_log插入一条数据

end;

  运行实例:

sqlite> delete from student where ID=4;
sqlite> delete from student where ID=1;
sqlite> delete from student where ID=2;
sqlite> select * from delete_log;
ID          ENTRY_DATE
----------  -------------------
4           2016-07-02 05:26:49
1           2016-07-02 05:27:01
2           2016-07-02 05:27:07
sqlite>

注意:

  触发器中的'new'代表新的, 还可以用'old',表示操作之前的信息。
  这个例子中,delete之后记录就没有了,若用new就没有不合适了(没有new.ID)。

查找触发器:

  可以在表sqlite_master中找出所有触发器:

sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger';

  查询指定表中的触发器:

sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger' AND tbl_name = 'table_name';

  比如:

sqlite> select name from sqlite_master where type = 'trigger' and tbl_name='student';
name
-----------
student_log
sqlite>

删除触发器:

sqlite> DROP TRIGGER trigger_name;
  1. 请实现一个触发器,每次查询之后就生成一条日志。