触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。
举个例子,如果说要删除一个班级和一个班级的学生,写程序得两个步骤,第一次删除一个班级的学生,第二步再删除这个班级,很麻烦,效率也不高,间隔触发器,就是在删除班级的时候,会触发删除该班级的学生,很快,很方便。。
先上个例子,看看用法,呵呵,以后记住怎么用。。
CREATETABLE 进销表
(
进销日期date,
商品号integer,
商品名,
摘要,
数量integer,
单价REAL
);
CREATETABLE 库存表
(
商品号integerprimary key,
商品名,
数量integer,
单价REAL
);
对于某商品的第一笔进货,库存里肯定没有,那对于这件商品的库存数量一定是这笔进货的数量,单价也是这笔进货的单价,那么它的sql语句是:
INSERTINTO 库存表 VALUES(商品号,商品名,数量,单价);
当对同样的商品进了第二笔货,单价发生了变化,(对于销货,只须对数量前加个减号就行了) 那它的SQL语句应当是:
UPDATE库存 SET
库存表.单价 = (库存表.数量 * 库存表.单价 +
进销表.数量 * 进销表.单价) / (库存表.数量 + 进销表.数量),
库存表.数量 = (库存表.数量 + 进销表.数量)
WHERE库存表.商品号 = 进销表.商品号;
我看了看SQLITE官方网站的sqlite3触发器的语法图,并没有什么 IF ELSE 语句,后来我尝试用 CASE WHEN…THEN…ELSE…语句,搞一塌糊涂,浪费了N 个小时,后来在网上好容易查到一篇文章说:其中的WHEN操作符表示了执行该触发器的条件,弥补了SQLite没有IF-ELSE这样逻辑分析语句的缺陷,例如:
CREATETRIGGER NEW_BOARD_CLASS_TRG UPDATEOF CLASS ONFAVOR_BOARD
WHENNEW.CLASS NOTIN (SELECTBBS_CLASS.NAMEFROM BBS_CLASS)
BEGIN
INSERTINTO BBS_CLASS(NAME,SECTION)VALUES(NEW.CLASS,NULL);
END;
这个给我深受启发,于是我建了两个触发器,一个是判断库存表中是否有这个商品,如果没有就新增一条记录.
另一个当然是有这个商品,那就是更新这个商品的库存量和单价.完整的触发器语句如下:
CREATETRIGGER 更新库存A
AFTERINSERT ON 进销表
WHENNEW.商品号 NOTIN(SELECT库存表.商品号 from库存表)
BEGIN
INSERTINTO 库存表 VALUES(NEW.商品号,NEW.商品名,NEW.数量,NEW.单价);
END;
CREATETRIGGER 更新库存B
AFTERINSERT ON 进销表
BEGIN