说明:
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;