[关闭]
@a5635268 2015-09-23T08:08:34.000000Z 字数 2407 阅读 1092

【mysql的编程专题②】触发器

Mysql


类似tp里面的数据模型回调接口,在数据表增删改的前或后触发执行其他的预订的sql;
一个触发器要具备4要素:
1.监视地点 -- 要执行触发器的表
2.监视事件 -- 由什么DML事件来牵引
3.触发时间 -- 是在DML事件发生的前或后
4.触发事件 -- 要触发执行的预订sql,也是DML

创建触发器

  1. create trigger <触发器名称>
  2. { before | after}
  3. {insert | update | delete}
  4. on <表名>
  5. for each row
  6. <触发器SQL语句>

实例

  1. -- 创建练习需要用的两张表
  2. CREATE TABLE `orders` (
  3. `oid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  4. `gid` tinyint(4) DEFAULT NULL,
  5. `num` smallint(5) unsigned NOT NULL DEFAULT '0',
  6. PRIMARY KEY (`oid`),
  7. KEY `gid` (`gid`)
  8. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  9. CREATE TABLE `goods` (
  10. `gid` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  11. `gname` varchar(100) NOT NULL DEFAULT '',
  12. `stock` smallint(5) unsigned NOT NULL DEFAULT '0',
  13. PRIMARY KEY (`gid`),
  14. KEY `stock` (`stock`)
  15. ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
  16. -- 为商品表插入数据
  17. INSERT INTO `goods`(`gname`,`stock`) VALUES('电脑',45),('自行车',50),('汽车',100),('手机',500);
  18. -- 创建触发器 tg1,监视订单表,当订单表增加订单时,商品表就得减少;
  19. DELIMITER $
  20. CREATE TRIGGER `tg1`
  21. AFTER INSERT ON `orders` -- 在订单表发生插入时
  22. FOR EACH ROW -- 每一行数据的插入都要触发TRIGGER
  23. BEGIN -- 开始书写预订要被触发的SQL
  24. UPDATE `goods` SET `stock` = `stock` - `new`.`num` WHERE `gid` = `new`.`gid`; -- new.num就是新增的订单表row的值;由于此处预订的sql是以分号结尾,所以再创建trigger之初就得把mysql默认的分号结束符改为其他的,否则mysql就会以为到此句就结束,于是报错;
  25. END $
  26. DELIMITER ; -- 更改回来;
  27. -- 创建触发器 tg2,监视订单表,当订单被删掉时,商品表增加;
  28. DELIMITER $
  29. CREATE TRIGGER `tg2`
  30. AFTER DELETE ON `orders`
  31. FOR EACH ROW
  32. BEGIN
  33. UPDATE `goods` SET `stock` = `stock` + `old`.`num` WHERE `gid` = `old`.`gid`;
  34. END $
  35. DELIMITER ;
  36. -- 创建触发器 tg3,监视订单表,在订单增加前判断是否大于5,如果大于5,就让其等于5(限购5个);
  37. DELIMITER $
  38. CREATE TRIGGER `tg3`
  39. BEFORE INSERT ON `orders`
  40. FOR EACH ROW
  41. BEGIN
  42. IF `new`.`num` > 5
  43. THEN
  44. SET `new`.`num` = 5;
  45. END IF;-- begin内每句要执行的sql都要带分号结束,这一个判断语句其实是指定了两句sql
  46. UPDATE `goods` SET `stock` = `stock` - `new`.`num` WHERE `gid` = `new`.`gid`;
  47. END $
  48. DELIMITER ;

项目中用到实例

  1. delimiter $
  2. CREATE TRIGGER sum_rebate_tg
  3. after update on sc_supplier_rebate
  4. for each row
  5. begin
  6. if new.is_confirm = 1
  7. then
  8. set @fl = new.consume_discount + new.recommend_discount;
  9. update sc_supplier_average_score set sum_rebate = @fl where supplier_id = new.supplier_id;
  10. elseif new.is_confirm = 0
  11. THEN
  12. update sc_supplier_average_score set sum_rebate = 0 where supplier_id = new.supplier_id;
  13. end if;
  14. end $
  15. delimiter ;

关于new和old

删除触发器

DROP TRIGGER [schema_name.]trigger_name

舍弃触发程序。方案名称(schema_name)是可选的。如果省略了schema(方案),将从当前方案中舍弃触发程序。

DROP TRIGGER test.num

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注