触发器是由事件来触发某个操作,这些事件包括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>
查看触发器
查看触发器是指查看数据库中已存在的触发器的定义、状态和语法信息等。
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表示触发器执行的操作
在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>
Comments | NOTHING