美文网首页mysql数据库
mysql中的触发器

mysql中的触发器

作者: Geroge1226 | 来源:发表于2021-07-10 16:32 被阅读0次

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

相关文章

  • 触发器

    MySQl中触发器 MySQl中触发器的语法如下: 例子:其中,new代表新插入的行记录

  • PHP操作MYSQL触发器讲解

    一,触发器 1.创建触发器 在MySQL中,创建触发器语法如下: 代码如下: CREATE TRIGGER tri...

  • MySQL之触发器

    本文主要介绍MySQL中触发器的相关知识与应用,为什么使用触发器,以及如何使用触发器。 I、触发器简介 如果我们想...

  • dbForge Studio for MySQL 触发器调试

    使用工具:dbForge Studio for MySQL 1,创建触发器 2,调试触发器 要调试MySQL触发...

  • Oracle与Mysql中的触发器(Trigger)对比

    Oracle触发器 Demo(通过触发器结合创建序列(sequence)的方式实现字段递增) Mysql 触发器(...

  • MySQL触发器

    在本节中,您将学习如何使用MySQL触发器。 根据定义,触发器或数据库触发器是自动执行以响应于在表中发生的特定事件...

  • mysql必知必会(25):触发器

    一、触发器 版本要求:MySQL5+ 触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BE...

  • Mysql与Pymysql

    这次介绍mysql以及在python中如何用pymysql操作数据库, 以及在mysql中存储过程, 触发器以及事...

  • Mysql中的触发器

    触发器 MySQL包含对触发器的支持。触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用...

  • mysql中的触发器

    1、介绍 触发器(trigger)是由事件来触发某个操作。事件包括:insert语句, update语句和`de...

网友评论

    本文标题:mysql中的触发器

    本文链接:https://www.haomeiwen.com/subject/hcbfpltx.html