首页 > SQL > sqlite3触发器的实战

sqlite3触发器的实战

  触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( REPLACE,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。
  举个例子,如果说要删除一个班级和一个班级的学生,写程序得两个步骤,第一次删除一个班级的学生,第二步再删除这个班级,很麻烦,效率也不高,间隔触发器,就是在删除班级的时候,会触发删除该班级的学生,很快,很方便。。

  先上个例子,看看用法,呵呵,以后记住怎么用。。

CREATE TABLE 进销表
(
 进销日期 date,
  商品号 integer,
  商品名,
  摘要,
  数量 integer,
  单价 REAL
);

CREATE TABLE 库存表
(
 商品号 integer primary key,
 商品名,
 数量 integer,
 单价 REAL
);

  对于某商品的第一笔进货,库存里肯定没有,那对于这件商品的库存数量一定是这笔进货的数量,单价也是这笔进货的单价,那么它的sql语句是:

    REPLACE INTO 库存表 VALUES(商品号,商品名,数量,单价);

  当对同样的商品进了第二笔货,单价发生了变化,(对于销货,只须对数量前加个减号就行了) 那它的SQL语句应当是:

    UPDATE 库存 SET 
         库存表.单价 = (库存表.数量 * 库存表.单价 + 
           进销表.数量 * 进销表.单价) / (库存表.数量 + 进销表.数量), 
         库存表.数量 = (库存表.数量 + 进销表.数量)  
         WHERE 库存表.商品号 = 进销表.商品号;

  我看了看SQLITE官方网站的sqlite3触发器的语法图,并没有什么 IF ELSE 语句,后来我尝试用 CASE WHEN…THEN…ELSE…语句,搞一塌糊涂,浪费了N 个小时,后来在网上好容易查到一篇文章说:其中的WHEN操作符表示了执行该触发器的条件,弥补了SQLite没有IF-ELSE这样逻辑分析语句的缺陷,例如:

CREATE TRIGGER NEW_BOARD_CLASS_TRG UPDATE OF CLASS ON FAVOR_BOARD
        WHEN NEW.CLASS NOT IN (SELECT BBS_CLASS.NAME FROM BBS_CLASS)
BEGIN
        REPLACE INTO BBS_CLASS(NAME, SECTION) VALUES(NEW.CLASS, NULL);
END;

  这个给我深受启发,于是我建了两个触发器,一个是判断库存表中是否有这个商品,如果没有就新增一条记录.
  另一个当然是有这个商品,那就是更新这个商品的库存量和单价.完整的触发器语句如下:

CREATE TRIGGER 更新库存A 
    AFTER REPLACE ON 进销表 
    WHEN NEW.商品号 NOT IN(SELECT 库存表.商品号 from 库存表)
BEGIN  
    REPLACE INTO 库存表 VALUES(NEW.商品号,NEW.商品名,NEW.数量,NEW.单价);
END;

CREATE TRIGGER 更新库存B
     AFTER REPLACE ON 进销表
BEGIN
  1. Queena 1月 24th, 2013 @ 17:53 | #1

    I just want to say I’m newbie to blogs and really savored this blog site. Probably I’m going to bookmark your website . You certainly come with fabulous article content. With thanks for revealing your blog.

  2. Gregorius 4月 23rd, 2013 @ 00:39 | #2

    It’s much esaeir to understand when you put it that way!

  3. Olga 4月 23rd, 2013 @ 00:40 | #3

    What a pleasure to find someone who thinks through the isuses

  4. Nurul 4月 23rd, 2013 @ 09:49 | #4

    Keep it cmonig, writers, this is good stuff.

评论提交中, 请稍候...

留言


可以使用的标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Trackbacks & Pingbacks ( 0 )
  1. 还没有 trackbacks