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
浙公网安备 33010602011771号