mysql数据库

mysql中的触发器

2021-07-10  本文已影响0人  Geroge1226

1、介绍

触发器(trigger)是由事件来触发某个操作。事件包括:insert语句, update语句和`delete语句。触发器是与表相关的书库对象。

【例如】:有一个用户签到场景,签到记录表,此外还有一张签到总数表,没当签到表插入一条数据,这签到总数表中的数量就加一。此时便可用触发器来完成总数的统计。

2、触发器理论

3、触发器实战

3.1 触发器创建

(1)创建一个执行程序语法格式:

create trigger 触发器名  before | after  触发事件   on 表名 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;之间的语句的执行效率一定要高,资源消耗要小。触发器尽量少的使用,因为不管如何,它还是很消耗资源,如果使用的话要谨慎的使用,确定它是非常高效的:触发器是针对每一行的;对增删改非常频繁的表上切记不要使用触发器,因为它会非常消耗资源。

上一篇下一篇

猜你喜欢

热点阅读