mysql中的触发器
1、介绍
触发器(trigger
)是由事件来触发某个操作。事件包括:insert
语句, update
语句和`delete语句。触发器是与表相关的书库对象。
【例如】:有一个用户签到场景,签到记录表,此外还有一张签到总数表,没当签到表插入一条数据,这签到总数表中的数量就加一。此时便可用触发器来完成总数的统计。
2、触发器理论
3、触发器实战
3.1 触发器创建
(1)创建一个执行程序语法格式:
create trigger 触发器名 before | after 触发事件 on 表名 for each row 执行语句
- 触发器名:要创建的触发器名称
- before | after : 触发器执行的时间点,before 在触发事件之前执行,after在触发事件后执行。
- 触发事件: 触发的条件,可选值:insert、update、delete。
- 表名:触发事件操作的表名
- for each row: 任何一条记录上的操作满足触发事件都会触发该触发器。
- 执行语句: 触发器被触发后执行的程序。
现在两张表: class 与 dep_time
mysql> create trigger dep_trigger before insert on class for each row insert into dep_time values(now());
Query OK, 0 rows affected (0.09 sec)
(2)创建多个执行语句的触发器
create trigger 触发器名
before | after 触发事件
on 表名 for each row
begin
执行语句列表
end
在begin和end之间添加多个执行语句,执行语句之间用分号(“;”)隔开。
注
:mysql默认是以 “;” 作为结束执行语句。创建触发器中会使用分号(";"),此时用 delimiter语句解决,此时语句就变成:
mysql> delimiter &&
mysql> create trigger dep_trigger2 before insert
-> on class for each row
-> begin
-> insert into dep_time values(now());
-> insert into dep_time values(now());
-> end
-> &&
Query OK, 0 rows affected (0.08 sec)
mysql> delimiter;
3.2 触发查看
(1)show triggers 语句查看
mysql> show triggers \G;
*************************** 1. row ***************************
Trigger: dep_trigger
Event: INSERT
Table: class
Statement: insert into dep_time values(now())
Timing: BEFORE
Created: 2021-07-09 16:50:20.24
sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
*************************** 2. row ***************************
Trigger: dep_trigger2
Event: INSERT
Table: class
Statement: begin
insert into dep_time values(now());
insert into dep_time values(now());
end
Timing: BEFORE
Created: 2021-07-09 17:05:59.01
sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
2 rows in set (0.00 sec)
注
:show triggers方式不能查看指定的触发器,只能查询全部触发器。
(2)通过数据库information_schema
中的triggers
表查看。
mysql> select * from information_schema.triggers \G &&
*************************** 1. row ***************************
TRIGGER_CATALOG: def
TRIGGER_SCHEMA: mysel_finance
TRIGGER_NAME: dep_trigger
EVENT_MANIPULATION: INSERT
EVENT_OBJECT_CATALOG: def
EVENT_OBJECT_SCHEMA: mysel_finance
EVENT_OBJECT_TABLE: class
ACTION_ORDER: 1
ACTION_CONDITION: NULL
ACTION_STATEMENT: insert into dep_time values(now())
ACTION_ORIENTATION: ROW
ACTION_TIMING: BEFORE
ACTION_REFERENCE_OLD_TABLE: NULL
ACTION_REFERENCE_NEW_TABLE: NULL
ACTION_REFERENCE_OLD_ROW: OLD
ACTION_REFERENCE_NEW_ROW: NEW
CREATED: 2021-07-09 16:50:20.24
SQL_MODE: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
DEFINER: root@localhost
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
DATABASE_COLLATION: utf8_general_ci
所有的触发器都存放在information_schema
数据库下triggers
表中,这里可以通过trigger_name
筛选触发器。
select * from information_schema.triggers where trigger_name='dep_trigger' \G;
3.3、删除触发器
drop trigger 触发器名;
mysql> drop trigger dep_trigger2;
Query OK, 0 rows affected (0.05 sec)
mysql>
4、触发器注意事项
4.1 触发器使用限制
触发器中的执行语句
存在如下限制,不能包含 start transaction、commit 或rollback等关键词,也不能包含call语句。
多个执行语句的触发器,在任何一个执行步骤出错都会阻止程序向下执行,但是已经更新过的记录不能在回滚,更新后的数据将继续保持在表中,因此,需要慎重使用触发器(最好不用),假设触发器触发每次执行1s,insert table 500条数据,那么就需要触发500次触发器,光是触发器执行的时间就花费了500s,而insert 500条数据一共是1s,那么这个insert的效率就非常低了。因此我们特别需要注意的一点是触发器的begin end;之间的语句的执行效率一定要高,资源消耗要小。触发器尽量少的使用,因为不管如何,它还是很消耗资源,如果使用的话要谨慎的使用,确定它是非常高效的:触发器是针对每一行的;对增删改非常频繁的表上切记不要使用触发器,因为它会非常消耗资源。