触发器:一类特殊的事物。可监视某种数据操作,并触发相关操作(insert/update/delete)。表中的某些数据改变,希望同一时候能够引起其他相关数据改变的需求。

作用:变化自己主动完毕某些语句查询,加入程序的灵活性。
创建触发器语法:
#delimiter $$  //默认情况下。delimiter是分号“;”,sql语句带有;号结尾会报错,没到end就算到结束了,使用delimiter
$$作用就是告诉mysql语句的结尾换成以$结束,对应使用end$$结束
create trigger test1  #触发器名称
(after/before) #触发时间
(insert/update/delete) #监视事件
on table #监视地点(表名)
for each row #mysql必须加的
begin
sql1
...
sqlN
end。
#end$$
查询已有trigger:show triggers
删除已有trigger:drop trigger 触发器名称
new/old:
update触发:old 代表更新前的记录。new 代表更新后的记录.
insert触发:old 不能使用。new 代表插入的记录.
delete触发:old 代表删除的记录。

new 不能使用.


实例操作:
goods商品表和ord订单表
CREATE TABLE goods(
`goods_id` INT(10),
`name` VARCHAR(20),
`num` SMALLINT(4)
)ENGINE=INNODB CHARSET=utf8
CREATE TABLE `ord`(
`oid` INT(10),
`gid` INT(10),
`much` INT(10)
)ENGINE=INNODB CHARSET=utf8
INSERT INTO goods VALUES
(1, 'cat', 26),(2, 'dog', 26),(3, 'pig', 26);
1、要求每下一个订单,goods表中的库存对应降低订单的数量。

mysql> select * from goods
+----------+------+------+
| goods_id | name | num |
+----------+------+------+
| 1 | cat | 26 |
| 2 | dog | 26 |
| 3 | pig | 26 |
+----------+------+------+
3 rows in set (0.00 sec)
mysql> select * from ord;
Empty set (0.00 sec)

#创建触发器test1
DELIMITER $$
CREATE TRIGGER test1
AFTER
INSERT
ON `ord`
FOR EACH ROW
BEGIN
UPDATE goods SET num= num - new.much WHERE goods_id = new.gid;
END$$
mysql> CREATE TRIGGER test1
    -> AFTER
    -> INSERT
    -> ON `ord`
    -> FOR EACH ROW
    -> BEGIN
    -> UPDATE goods SET num= num - new.much WHERE goods_id = new.gid;
    -> END$$
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO `ord` VALUES (1, 2, 2)$$
Query OK, 1 row affected (0.03 sec)
mysql> select * from ord$$
+------+------+------+
| oid | gid | much |
+------+------+------+
| 1 | 2 | 2 |
+------+------+------+
1 row in set (0.00 sec)
mysql> select * from goods$$
+----------+------+------+
| goods_id | name | num |
+----------+------+------+
| 1 | cat | 26 |
| 2 | dog | 24 |
| 3 | pig | 26 |
+----------+------+------+
3 rows in set (0.00 sec)
goods表里面的dog由26变成24

2、用户取消订单后商品库存订单的商品数要正常入库。

下面仅仅写触发器trigger,操作过程不写太多比較乱。

#触发器test2
CREATE TRIGGER test2
AFTER
DELETE
ON `ord`
FOR EACH ROW
BEGIN
UPDATE goods SET num = num + old.much WHERE goods_id = old.gid;
END $$

3、用户更新订单的时候。商品库存要依据订单的数量正常更新。
#触发器test3
CREATE TRIGGER test3
AFTER
UPDATE
ON `ord`
FOR EACH ROW
BEGIN
UPDATE goods SET num = num + old.much - new.much WHERE goods_id = new.gid;
END$$


查询触发器

删除触发器

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3V1Z2xlMjAxMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


最新文章

  1. Python学习笔记——条件和循环
  2. Autorelease自动释放池的使用
  3. 【Remoting】.Net remoting方法实现简单的在线升级(下篇:重启exe)
  4. for循环的执行顺序
  5. IE11新文档模式Edge介绍与评估,及在WebBrowser应用中的使用。
  6. 【原】storm源码之storm代码结构【译】
  7. Xcode8 - apploader 上传失败 - ERROR ITMS-90168: "The binary you uploaded was invalid."
  8. HDU 1533 Going Home (最小费用流)
  9. 关于java reflect
  10. linux目录权限小记
  11. Co-Debugging JNI with Android Studio and Visual Studio
  12. java.net.SocketException: Broken pipe 异常可能的原因
  13. docker~使用阿里加速器
  14. 如何编写单元测试-基于Spring
  15. mybatis动态sql排序无效
  16. mysql新建数据库、新建用户及授权操作
  17. java ee期末项目相关
  18. 宕机不等于关机,阴魂不散的vm
  19. SQL Server char,varchar,nchar,nvarchar区别
  20. TZOJ 4912 炮兵阵地(状压dp)

热门文章

  1. POJ-1087 二分图匹配,最大流。
  2. LAMP第三部分php配置和mysql配置
  3. 【bzoj1822】[JSOI2010]Frozen Nova 冷冻波 计算几何+二分+网络流最大流
  4. 【bzoj4012】[HNOI2015]开店 动态点分治+STL-vector
  5. xctf --Hctf2014 Quals write up
  6. vue-element-admin开发模式下style标签热更新失效[解决办法]
  7. 冬训 day2
  8. 解决Navicat 报错:1130-host ... is not allowed to connect to this MySql server,MySQL不允许从远程访问的方法
  9. the project was not built since its build……
  10. [Oracle] 临时将Physical Standby激活