sqlite3触发器的实战

  触发器(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


你可能感兴趣的:(sql)