触发器
触发器基本概念
触发器定义:是一类特殊的事务。可以监视某种数据操作(insert/update/delete)。并触发相关数据操作(insert/update/delete)。
触发器应用场景:
1.当向一张表中添加或删除记录时,需要在相关表中进行同步操作。比如,当一个订单产生时,订单所购的商品的库存量相应减少。
2.当表上某列数据的值与其他表中的数据有联系时。比如,当某客户进行欠款消费,可以在生成订单时通过设计触发器判断该客户的累计欠款是否超出了最木限度。
3.当需要对某张表进行跟踪时。比如,当有新订单产生时,需要及时通知相关人员进行处理,此时可以在订单表上设计添加触发器加以实现。
触发器创建语句四要素:
- 1.监视地点(table)
- 2.监视事件(insert/update/delete)
- 3.触发时间(after/before)
- 4.触发事件(insert/update/delete)
简单的触发器创建
mysql> delimiter $
mysql> create trigger t1
-> after
-> insert on ord
-> for each row
-> begin
-> update goods set num=num-2 where gid=1;
-> end$
Query OK, 0 rows affected (0.82 sec)
mysql> show triggers \G
*************************** 1. row ***************************
Trigger: t1
Event: INSERT
Table: ord
Statement: begin
update goods set num=num-2 where gid=1;
end
Timing: AFTER
Created: 2021-04-20 19:16:54.72
sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Definer: root@localhost
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
Database Collation: utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
行变量
-
insert:只有new变量
-
delete:只有old变量
-
update:既有old变量又有new变量
需求:
商品表:goods
订单表:ord
下一个订单,仓库存储就减少相应的数量
mysql> create trigger t2
-> after insert on ord
-> for each row
-> begin
-> update goods set num = num-new.much where gid=new.gid;
-> end$
Query OK, 0 rows affected (0.49 sec)
mysql> drop trigger t1;
-> $
Query OK, 0 rows affected (0.24 sec)
mysql> show triggers \G
*************************** 1. row ***************************
Trigger: t2
Event: INSERT
Table: ord
Statement: begin
update goods set num = num-new.much where gid=new.gid;
end
Timing: AFTER
Created: 2021-04-20 19:27:33.64
sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Definer: root@localhost
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
Database Collation: utf8mb4_0900_ai_ci
1 row in set (0.10 sec)
mysql> select * from goods;
-> $
+------+------+------+
| gid | name | num |
+------+------+------+
| 1 | cat | 40 |
| 2