MySQL触发器

1.触发器创建四要素:

  • 监视地点—table
  • 监视事件—insert/update/delete
  • 触发时间—before/after
  • 触发事件—insert/update/delete

2.创建触发器格式:

create triger triger_name after insert/update/delete on table_name

for each row

begin

  sql语句;

end

3.触发器示例:

#商品表

CREATE TABLE goods (
    id INT PRIMARY KEY auto_increment,
    NAME VARCHAR (20),
    num INT
)
INSERT INTO goods(name,num) VALUES('商品1',10),('商品2',10),('商品3',10);

#订单表

CREATE TABLE order_goods(
    oid INT PRIMARY KEY auto_increment,
    gid INT,
    much INT
)

  1.购买商品

  订单记录添加后,对应的商品数量要减少

  • 写死的触发器
    DROP TRIGGER IF EXISTS tg1;
    CREATE TRIGGER tg1 AFTER INSERT ON order_goods FOR EACH ROW
    BEGIN
        #写死了,没办法自动调整
        #UPDATE goods SET num=num-3 where id=1; 
    END
    #无论写的那个最终减少的都是‘商品1’
    insert into order_goods(gid,much) values(2,4);
  • 灵活的触发器
    DROP TRIGGER IF EXISTS tg1;
    CREATE TRIGGER tg1 AFTER INSERT ON order_goods FOR EACH ROW
    BEGIN 
        #能够自动调整:对于insert而言,新插入的行用new来表示,行中的每一列的值用new.列名来表示。
        UPDATE goods SET num = num - new.much WHERE id = new.gid;
    END
    
    insert into order_goods(gid,much) values(2,4);

    2.撤销订单

    直接删除一个订单,需要把对应的商品数量再加回去
    DROP TRIGGER IF EXISTS tg2;
    CREATE TRIGGER tg2 AFTER delete ON order_goods FOR EACH ROW
    BEGIN
    #对于delete而言:原本有一行,后来被删除,想引用被删除的这一行,用old来表示,old.列名可以引用被删除的行的值。
        UPDATE goods SET num=num+old.much where id=old.gid;
    END
    
    DELETE FROM order_goods where gid=2;

    3.更新订单

   更新订单,先把原来的数加上,然后再减去新的数

DROP TRIGGER IF EXISTS tg3;
CREATE TRIGGER tg3 AFTER UPDATE ON order_goods FOR EACH ROW
BEGIN
#对于delete而言:原本有一行,后来被删除,想引用被删除的这一行,用old来表示,old.列名可以引用被删除的行的值。
    UPDATE goods SET num=num+old.much-new.much where id=old.gid;
END

update order_goods set much=3 where gid=2;

4.after与before

after是先完成数据的增删改,再触发,触发的语句晚于监视的增删改操作,无法影响前面的增删改动作;也就是说先插入订单记录,再更新商品的数量;

before是先完成触发,再增删改,触发的语句先于监视的增删改,我们就有机会判断,修改即将发生的操作;

案例:当新增一条订单记录时,判断订单的商品数量,如果数量大于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了,就不会出现负数了。

 

引用:http://www.cnblogs.com/zzwlovegfj/archive/2012/07/04/2576989.html

 

 

posted @ 2014-06-13 16:02  刘朝样  阅读(100)  评论(0)    收藏  举报