Mysql之触发器

来源:互联网 发布:淘宝试客联盟 编辑:程序博客网 时间:2024/06/03 20:24
触发器SQLite 的触发器是数据库的回调函数,它会自动执行/指定的数据库事件发生时调用。以下是关于SQLite的触发器的要点: SQLite 触发器(Trigger)是数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用。

1、以下是关于 SQLite 的触发器(Trigger)的要点:

  • SQLite 的触发器(Trigger)可以指定在特定的数据库表发生 DELETE、INSERT 或 UPDATE 时触发,或在一个或多个指定表的列发生更新时触发。

  • SQLite 只支持 FOR EACH ROW 触发器(Trigger),没有 FOR EACH STATEMENT 触发器(Trigger)。因此,明确指定 FOR EACH ROW 是可选的。

  • WHEN 子句和触发器(Trigger)动作可能访问使用表单 NEW.column-name 和 OLD.column-name 的引用插入、删除或更新的行元素,其中 column-name 是从与触发器关联的表的列的名称。

  • 如果提供 WHEN 子句,则只针对 WHEN 子句为真的指定行执行 SQL 语句。如果没有提供 WHEN 子句,则针对所有行执行 SQL 语句。

  • BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。

  • 当触发器相关联的表删除时,自动删除触发器(Trigger)。

  • 要修改的表必须存在于同一数据库中,作为触发器被附加的表或视图,且必须只使用 tablename,而不是database.tablename。

  • 一个特殊的 SQL 函数 RAISE() 可用于触发器程序内抛出异常。

2、(trigger):监视某种情况,并触发某种操作。  
触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/before) 4.触发事件(insert/update/delete)  
语法:  
create trigger triggerName  
after/before insert/update/delete on 表名  
for each row   #这句话在mysql是固定的  
begin  
sql语句;  
end;  
注:各自颜色对应上面的四要素。

先讲一下after和before的区别:  
after是先完成数据的增删改,再触发,触发的语句晚于监视的增删改操作,无法影响前面的增删改动作;也就是说先插入订单记录,再更新商品的数量;  
before是先完成触发,再增删改,触发的语句先于监视的增删改,我们就有机会判断,修改即将发生的操作;

3、例子:
    
我们用一个典型案例来区分它们的区别,新建一个触发器:  
#监视地点: 商品表o  
#监视事件:insert  
#触发时间:before  
#触发事件:update  
案例:当新增一条订单记录时,判断订单的商品数量,如果数量大于10,就默认改为10  
create trigger tg6  
before insert on o  
for each row  
begin  
  if new.much > 10 then  
    set new.much = 10;  
  end if;  
  update g set num = num - new.much where id = new.gid;  
end$  

执行完,把之前创建的after触发器删掉,再来插入一条订单记录:  
insert into o(gid,much) valus(1,20)$  
执行完会发现订单记录的数量变为10,商品1的数量变为0了,就不会出现负数了。  
每天进步一点点。

0 0