1:定义
是一种特殊的存储过程。一般的存储过程是通过存储过程名直接调用,而触发器主要是通过事件(增、删、改)进行触发而被执行的。其在表中数据发生变化时自动强制执行。常见的触发器有两种:after(for)、instead of,用于insert、update、delete事件。
after(for) 表示执行代码后,执行触发器
instead of 表示执行代码前,用已经写好的触发器代替你的操作
2:语法
Create trigger triggerName
After/before insert/delete/update on 表名
For each row //写死
Begin
Sql语句;( insert/delete/update)
end
//After/before(代表触发的时间)
//insert/delete/update(代表监视的事件)
//表名(表名为监视的地点)
//Sql语句;( insert/delete/update)为触发事件
如何在触发器引用行的值
对于insert而言,新增的行用new表示,行中的每一列用new.列表表示
对于delete而言,原本有一行,后被删除想引用被删除的这一行,用old表示
对于update而言,被修改的行,修改之前的数据用old来表示,修改之后的用new表示
删除触发器 Drop trigger triggername;
代码分析:
//创建两个表,orders订单表,product商品表
mysql> select * from product;
-> $(该符号表示结束符)
//delimiter $ 告诉MySQL解释器,当碰到$时,才执行命令.
mysql> select * from product;
-> $
+----+------+-----+
| id | name | num |
+----+------+-----+
| 1 | 牛 | 57 |
| 2 | 羊 | 80 |
| 3 | 猪 | 80 |
+----+------+-----+
此时订单表数据为空
往订单加入数据
mysql> insert into orders(gid,much) values(2,10);
insert into orders(gid,much) values(3,5);
-> $
Query OK, 1 row affected
Query OK, 1 row affected
(订单拿走羊10只,猪5个,所以最后在商品表里面样的数量由80变为70,猪的数量由80变为75)
mysql> select * from product;
-> $
+----+------+-----+
| id | name | num |
+----+------+-----+
| 1 | 牛 | 57 |
| 2 | 羊 | 70 |
| 3 | 猪 | 75 |
+----+------+-----+
3 rows in set
mysql> select * from orders;
-> $
+-----+-----+------+
| oid | gid | much |
+-----+-----+------+
| 4 | 2 | 10 |
| 5 | 3 | 5 |
+-----+-----+------+
2 rows in set
建立触发器
mysql> create trigger tg2
after delete on orders
for each row
begin
update product set num=num+old.much where id=old.id;
end$
Query OK, 0 rows affected
删除数据触动
mysql> delete from orders where id=3;
-> $
Query OK, 1 row affected
mysql> select * from orders;
-> $
+-----+-----+------+
| oid | gid | much |
+-----+-----+------+
| 4 | 2 | 10 |
+-----+-----+------+
1 row in set
显示触发器的结果
mysql> select * from product;
-> $
+----+------+-----+
| id | name | num |
+----+------+-----+
| 1 | 牛 | 57 |
| 2 | 羊 | 70 |
| 3 | 猪 | 80 |
+----+------+-----+
3 rows in set