MySQL 触发器


触发器是由事件来触发某个操作,这些事件包括INSERT、UPDATAE和DELETE语句。如果定义了触发程序,当数据库执行这些语句的时候就会激发触发器执行相应的操作,触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。触发器(trigger)是一个特殊的存储过程,不同的是,执行存储过程要使用CALL语句来调用,而触发器的执行不需要使用CALL语句来调用,也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MySQL自动调用。

触发器的创建及使用

语法:CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt。触发器程序可以使用BEGIN和END作为开始和结束,中间包含多条语句

  • trigger_name表示触发器名称,用户自行指定
  • trigger_time表示触发时机,可以指定为before或after;
  • trigger_event表示触发事件,包括INSERT、UPDATE和DELETE;
  • tbl_name表示建立触发器的表名,即在哪张表上建立触发器;
  • trigger_stmt是触发器执行语句。可以使用BEGIN和END作为开始和结束,中间包含多条语句。
mysql> create trigger total_age  before insert on user for each row set @a=@a+new.age;
Query OK, 0 rows affected (0.01 sec)

mysql> select sum(age) into @a from user;
Query OK, 1 row affected (0.00 sec)

mysql> select @a;
+------+
| @a   |
+------+
|   97 |
+------+
1 row in set (0.00 sec)

mysql> insert into user (name, email, age) values ('baby', 'baby@163.com', 20);
Query OK, 1 row affected (0.00 sec)

mysql> select @a;
+------+
| @a   |
+------+
|  117 |
+------+
1 row in set (0.00 sec)

mysql> 

查看触发器

查看触发器是指查看数据库中已存在的触发器的定义、状态和语法信息等。

  1. SHOW TRIGGERS语句查看触发器信息

    mysql> show triggers \G;
    *************************** 1. row ***************************
              Trigger: total_age
                Event: INSERT
                Table: user
            Statement: set @a=@a+new.age
               Timing: BEFORE
              Created: 2022-10-13 20:00:30.02
             sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,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)
    
    ERROR: 
    No query specified
    
    mysql> 
    
    • Trigger表示触发器的名称;
    • Event表示激活触发器的事件;
    • Table表示激活触发器的操作对象表;
    • Timing表示触发器触发的时间;
    • Statement表示触发器执行的操作
  2. 在triggers表中查看触发器信息
    在MySQL中,所有触发器的定义都存在INFORMATION_SCHEMA数据库的TRIGGERS表格中,可以通过查询命令SELECT查看。命令:SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE condition;

    mysql> select * from information_schema.triggers where trigger_name like 'total_%' \G;
    *************************** 1. row ***************************
            TRIGGER_CATALOG: def
             TRIGGER_SCHEMA: ronie
               TRIGGER_NAME: total_age
         EVENT_MANIPULATION: INSERT
       EVENT_OBJECT_CATALOG: def
        EVENT_OBJECT_SCHEMA: ronie
         EVENT_OBJECT_TABLE: user
               ACTION_ORDER: 1
           ACTION_CONDITION: NULL
           ACTION_STATEMENT: set @a=@a+new.age
         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: 2022-10-13 20:00:30.02
                   SQL_MODE: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,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)
    
    ERROR: 
    No query specified
    
    mysql> 
    
    • TRIGGER_SCHEMA表示触发器所在的数据库;
    • TRIGGER_NAME后面是触发器的名称;
    • EVENT_OBJECT_TABLE表示在哪个数据表上触发;
    • ACTION_STATEMENT表示触发器触发的时候执行的具体操作;
    • ACTION_ORIENTATION是ROW,表示在每条记录上都触发;
    • ACTION_TIMING表示触发的时刻是AFTER;
    • 剩下的是和系统相关的信息。

删除触发器

使用DROP TRIGGER语句可以删除MySQL中已经定义的触发器,语法:DROP TRIGGER [schema_name.]trigger_name

  • schema_name表示数据库名称。如果省略了schema,将从当前数据库中舍弃触发程序;
  • trigger_name是要删除的触发器的名称。
mysql> drop trigger total_age;
Query OK, 0 rows affected (0.01 sec)

mysql> 

声明:Hello World|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - MySQL 触发器


我的朋友,理论是灰色的,而生活之树是常青的!