一、触发器

  触发器是与表有关的数据库对象,指在insert/update/delete之前或者之后,触发并执行触发器中定义的sql语句集合,触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。

使用别名old和new来引用触发器中发生变化的记录内容,这与其他的数据库是相似的,现在触发器还只支持行级触发,不支持语句级触发。

二、触发器类型

  • insert型触发器:new表示将要或者已经新增的数据
  • update型触发器:old表示修改之前的数据,new表示将要或已经修改后的数据
  • delete型触发器:old表示将要或者已经删除的数据

三、触发器语法

  3.1 创建语法

create trigger trigger_name
before/after insert/update/delete
on tb_name for each row
begin
  trigger_stmt;
end;

  3.2 查看语法

show triggers;

  3.3 删除语句

drop trigger [schema_name.] trigger_name;  -- 如果没有指定schema_name,默认为当前数据库

四、插入数据触发器案例

  4.1 需求:

    通过触发器记录student表的数据插入时,将变更日志插入到日志表student_logs中;

  4.2 创建 student_logs表

mysql> create table student_logs(
-> id int primary key auto_increment,
-> operation varchar(20) comment "操作类型,insert/update/delete",
-> operate_time datetime comment "操作时间",
-> operate_id int comment "操作的ID",
-> operate_params varchar(500) comment "操作参数"
-> )comment "student操作日志表";
Query OK, 0 rows affected (1.18 sec)

  4.3 创建插入数据触发器

mysql>delimiter &
mysql> create trigger student_insert_trigger
-> after insert on student for each row
->begin
-> insert into student_logs(id,operation,operate_time,operate_id,operate_params) values (null, 'insert', now(), new.id, concat("插入的数据内容为:id=",new.id,"name=",new.name,"age=",new.age,"score=",new.score));
->end;
->&
Query OK, 0 rows affected (0.20 sec)

    说明1:delimiter &在之前的文章中已经提到过,是将mysql中的语句终止符由“;” 改为“&”,原因是,触发器中有完整的sql语句,会包含分号,如果不改,怎无法在终端中书写完整的触发器语句

  4.4 查看创建的触发器

mysql> delimiter ;
mysql> show triggers;
+------------------------+--------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------------------------------------------+-----------------------------------+----------------------+----------------------+--------------------+
| Trigger | Event | Table | Statement | Timing | Created | sql_mode | Definer | character_set_client | collation_connection | Database Collation |
+------------------------+--------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------------------------------------------+-----------------------------------+----------------------+----------------------+--------------------+
| student_insert_trigger | INSERT | student | begin insert into student_logs(id,operation,operate_time,operate_id,operate_params) values (null, 'insert', now(), new.id, concat("插入的数据内容为:id=",new.id,"name=",new.name,"age=",new.age,"score=",new.score)); end | AFTER | 2023-08-16 00:07:46.53 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | skip-grants user@skip-grants host | utf8mb4 | utf8mb4_0900_ai_ci | utf8mb4_0900_ai_ci |
+------------------------+--------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------------------------------------------+-----------------------------------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)

    说明2:delimiter是将sql语句终止符由“&”在改为“;”

  4.5 插入验证

mysql> insert into student(id,name,age,score) values(null,"李白",30,100);
Query OK, 1 row affected (0.21 sec) mysql> select * from student_logs;
+----+-----------+---------------------+------------+-----------------------------------------------------------+
| id | operation | operate_time | operate_id | operate_params |
+----+-----------+---------------------+------------+-----------------------------------------------------------+
| 1 | insert | 2023-08-16 00:21:47 | 5 | 插入的数据内容为:id=5name=李白age=30score=100 |
+----+-----------+---------------------+------------+-----------------------------------------------------------+
1 row in set (0.00 sec)

    说明3:插入数据李白的信息就已经自动的在student_logs中记录

五、修改数据触发器案例

  5.1 创建修改数据触发器

mysql>delimiter &
mysql> create trigger student_update_trigger after update on student for each row begin insert into student_logs(id, operation, operate_time,operate_id,operate_params) values (null,'update',now(),new_id,concat( '更新前数据:id=',old.id,',name=',old.name,',age=',old.age,',score=',old.score,' | 更新后数据:id=',new.id, ',name=',new.name, ',age=',new.age, ',score=',new.score)); end; &
Query OK, 0 rows affected (1.86 sec)
mysql> delimiter ;

  5.2 查看创建的触发器

mysql> show triggers;
+------------------------+--------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------------------------------------------+-----------------------------------+----------------------+----------------------+--------------------+
| Trigger | Event | Table | Statement | Timing | Created | sql_mode | Definer | character_set_client | collation_connection | Database Collation |
+------------------------+--------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------------------------------------------+-----------------------------------+----------------------+----------------------+--------------------+
| student_insert_trigger | INSERT | student | begin insert into student_logs(id,operation,operate_time,operate_id,operate_params) values (null, 'insert', now(), new.id, concat("插入的数据内容为:id=",new.id,"name=",new.name,"age=",new.age,"score=",new.score)); end | AFTER | 2023-08-16 00:07:46.53 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | skip-grants user@skip-grants host | utf8mb4 | utf8mb4_0900_ai_ci | utf8mb4_0900_ai_ci |
| student_update_trigger | UPDATE | student | begin insert into student_logs(id, operation, operate_time,operate_id,operate_params) values (null,'update',now(),new.id,concat( '更新前数据:id=',old.id,',name=',old.name,',age=',old.age,',score=',old.score,' | 更新后数据:id=',new.id, ',name=',new.name, ',age=',new.age, ',score=',new.score)); end | AFTER | 2023-08-16 23:38:26.36 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | skip-grants user@skip-grants host | utf8mb4 | utf8mb4_0900_ai_ci | utf8mb4_0900_ai_ci |
+------------------------+--------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------------------------------------------+-----------------------------------+----------------------+----------------------+--------------------+
2 rows in set (1.16 sec)

  5.3 查看student表原始数据

mysql> select * from student;
+----+--------+------+-------+
| id | name | age | score |
+----+--------+------+-------+
| 1 | 张三 | 18 | 88 |
| 2 | 李四 | 21 | 83 |
| 3 | 王五 | 24 | 76 |
| 4 | 赵六 | 19 | 94 |
| 5 | 李白 | 30 | 100 |
+----+--------+------+-------+
5 rows in set (1.30 sec)

  5.4 修改student表,验证触发器

mysql> update student set age=25 where id = 5;
Query OK, 1 row affected (0.38 sec)
Rows matched: 1 Changed: 1 Warnings: 0

  5.5 查看修改后的student表和student_logs表,验证触发器

mysql> select * from student;
+----+--------+------+-------+
| id | name | age | score |
+----+--------+------+-------+
| 1 | 张三 | 18 | 88 |
| 2 | 李四 | 21 | 83 |
| 3 | 王五 | 24 | 76 |
| 4 | 赵六 | 19 | 94 |
| 5 | 李白 | 25 | 100 |
+----+--------+------+-------+
5 rows in set (0.00 sec) mysql> select * from student_logs;
+----+-----------+---------------------+------------+-----------------------------------------------------------------------------------------------------------+
| id | operation | operate_time | operate_id | operate_params |
+----+-----------+---------------------+------------+-----------------------------------------------------------------------------------------------------------+
| 1 | insert | 2023-08-16 00:21:47 | 5 | 插入的数据内容为:id=5name=李白age=30score=100 |
| 2 | update | 2023-08-16 23:58:23 | 5 | 更新前数据:id=5,name=李白,age=30,score=100 | 更新后数据:id=5,name=李白,age=25,score=100 |
+----+-----------+---------------------+------------+-----------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

六、删除数据触发器案例

  6.1 创建删除数据触发器

mysql>delimiter &
mysql> create trigger student_delete_trigger after delete on student for each row begin insert into student_logs(id,operation,operate_time,operate_id,operate_params) values (null,'delete',now(),old.id, concat('删除之前的数据:id=',old.id, ',name=',old.name,',age=',old.age,',score=',old.score)); end;&
Query OK, 0 rows affected (0.87 sec)

  6.2 查看触发器

mysql> show triggers;
-> &
+------------------------+--------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------------------------------------------+-----------------------------------+----------------------+----------------------+--------------------+
| Trigger | Event | Table | Statement | Timing | Created | sql_mode | Definer | character_set_client | collation_connection | Database Collation |
+------------------------+--------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------------------------------------------+-----------------------------------+----------------------+----------------------+--------------------+
| student_insert_trigger | INSERT | student | begin insert into student_logs(id,operation,operate_time,operate_id,operate_params) values (null, 'insert', now(), new.id, concat("插入的数据内容为:id=",new.id,"name=",new.name,"age=",new.age,"score=",new.score)); end | AFTER | 2023-08-16 00:07:46.53 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | skip-grants user@skip-grants host | utf8mb4 | utf8mb4_0900_ai_ci | utf8mb4_0900_ai_ci |
| student_update_trigger | UPDATE | student | begin insert into student_logs(id, operation, operate_time,operate_id,operate_params) values (null,'update',now(),new.id,concat( '更新前数据:id=',old.id,',name=',old.name,',age=',old.age,',score=',old.score,' | 更新后数据:id=',new.id, ',name=',new.name, ',age=',new.age, ',score=',new.score)); end | AFTER | 2023-08-16 23:57:34.20 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | skip-grants user@skip-grants host | utf8mb4 | utf8mb4_0900_ai_ci | utf8mb4_0900_ai_ci |
| student_delete_trigger | DELETE | student | begin insert into student_logs(id,operation,operate_time,operate_id,operate_params) values (null,'delete',now(),old.id, concat('删除之前的数据:id=',old.id, ',name=',old.name,',age=',old.age,',score=',old.score)); end | AFTER | 2023-08-17 00:15:46.44 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | skip-grants user@skip-grants host | utf8mb4 | utf8mb4_0900_ai_ci | utf8mb4_0900_ai_ci |
+------------------------+--------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------------------------------------------+-----------------------------------+----------------------+----------------------+--------------------+
3 rows in set (0.00 sec)

  6.3 删除数据

mysql> delimiter ;
mysql> delete from student where id = 5;
Query OK, 1 row affected (0.70 sec)

  6.4 查看student表和student_logs表验证触发器

mysql> select * from student;
+----+--------+------+-------+
| id | name | age | score |
+----+--------+------+-------+
| 1 | 张三 | 18 | 88 |
| 2 | 李四 | 21 | 83 |
| 3 | 王五 | 24 | 76 |
| 4 | 赵六 | 19 | 94 |
+----+--------+------+-------+
4 rows in set (0.00 sec) mysql> select * from student_logs;
+----+-----------+---------------------+------------+-----------------------------------------------------------------------------------------------------------+
| id | operation | operate_time | operate_id | operate_params |
+----+-----------+---------------------+------------+-----------------------------------------------------------------------------------------------------------+
| 1 | insert | 2023-08-16 00:21:47 | 5 | 插入的数据内容为:id=5name=李白age=30score=100 |
| 2 | update | 2023-08-16 23:58:23 | 5 | 更新前数据:id=5,name=李白,age=30,score=100 | 更新后数据:id=5,name=李白,age=25,score=100 |
| 3 | delete | 2023-08-17 00:18:06 | 5 | 删除之前的数据:id=5,name=李白,age=25,score=100 |
+----+-----------+---------------------+------------+-----------------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

Mysql高级8-触发器的更多相关文章

  1. Mysql高级之触发器

    原文:Mysql高级之触发器 触发器是一类特殊的事务 ,可以监视某种数据操作(insert/update/delete),并触发相关操作(insert/update/delete). 看以下事件: 完 ...

  2. mysql高级:触发器、事务、存储过程、调用存储过程

    一.触发器 二.pymysql事务测试 三.存储过程 四.pymysql调用存储过程 一.触发器  在某个时间发生了某个事件时  会自动触发一段sql语句 create trigger cmd_ins ...

  3. mysql笔记04 MySQL高级特性

    MySQL高级特性 1. 分区表:分区表是一种粗粒度的.简易的索引策略,适用于大数据量的过滤场景.最适合的场景是,在没有合适的索引时,对几个分区进行全表扫描,或者是只有一个分区和索引是热点,而且这个分 ...

  4. mysql高级、索引

    一.mysql高级 1.视图 # 引子 select * from emp left join dep on emp.dep_id = dep.id union select * from emp r ...

  5. Mysql 高级部分

    MySQL 高级部分   (1)索引(index)..................................................................... 1 (2) ...

  6. 干货:鲜为人用的MySQL高级特性与玩法!

    上一篇文章<万字总结:学习MySQL优化原理,这一篇就够了!>文末给大家留有两个开放的问题: 有非常多的程序员在分享时都会抛出这样一个观点:尽可能不要使用存储过程,存储过程非常不容易维护, ...

  7. 【MySQL 高级】架构介绍

    MySQL高级 架构介绍 MySQL 简介 MySQL 安装 Docker 安装 参考链接 Linux 安装 参考链接 MySQL 配置文件 log-bin:二进制日志文件.用于主从复制.它记录了用户 ...

  8. mysql高级day3

    Mysql高级-day03 1. 应用优化 前面章节,我们介绍了很多数据库的优化措施.但是在实际生产环境中,由于数据库本身的性能局限,就必须要对前台的应用进行一些优化,来降低数据库的访问压力. 1.1 ...

  9. mysql高级day1

    Mysql高级-day01 MySQL高级课程简介 序号 Day01 Day02 Day03 Day04 1 Linux系统安装MySQL 体系结构 应用优化 MySQL 常用工具 2 索引 存储引擎 ...

  10. mysql 查询表,视图,触发器,函数,存储过程

    1. mysql查询所有表: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名' AND  TAB ...

随机推荐

  1. 2022-01-26:最优账单平衡。 一群朋友在度假期间会相互借钱。比如说,小爱同学支付了小新同学的午餐共计 10 美元。如果小明同学支付了小爱同学的出租车钱共计 5 美元。我们可以用一个三元组 (x

    2022-01-26:最优账单平衡. 一群朋友在度假期间会相互借钱.比如说,小爱同学支付了小新同学的午餐共计 10 美元.如果小明同学支付了小爱同学的出租车钱共计 5 美元.我们可以用一个三元组 (x ...

  2. Flutter三棵树系列之详解各种Key

    简介 key是widget.element和semanticsNode的唯一标识,同一个parent下的所有element的key不能重复,但是在特定条件下可以在不同parent下使用相同的key,比 ...

  3. TypeError: this.CliEngine is not a constructor

    vue cli3 项目老是提示TypeError: this.CliEngine is not a constructor这个,看着特别扭 解决方法也不难,直接点击Details 然后再点击,如下第一 ...

  4. 警惕看不见的重试机制:为什么使用RPC必须考虑幂等性

    0 文章概述 在RPC场景中因为重试或者没有实现幂等机制而导致的重复数据问题,必须引起大家重视,有可能会造成例如一次购买创建多笔订单,一条通知信息被发送多次等问题,这是技术人员必须面对和解决的问题. ...

  5. odoo开发教程十六:定时任务

    一:定义定时器数据模型 模型中定义需要用到的字段.定时方法 from odoo import models, fields, api, exceptions import logging from d ...

  6. 海量数据运维要给力,GaussDB(for Cassandra)来助力

    摘要:应用运维管理平台(AOM)和Cassandra是两个不可分割的组成部分,它们共同构成了一个高效的解决方案,可以帮助企业在应用运维业务上取得巨大的优势.在这篇文章中,我们将介绍AOM和Cassan ...

  7. 【踩坑记录】字节流数据按照string的方式读取然后按照string的方案存储,编码导致二进制数据发生变化,原理记录

    ​ 目录 问题缘由 背后原理 C#代码示例 总结 问题缘由 由于公司需求,需要读取游戏Redis数据做内外网数据迁移,没有与游戏组过多的沟通.  使用的数据类型是Hash, key是string,va ...

  8. windows10环境下安装RabbitMQ以及延时插件(图文)

    安装转载:https://www.cnblogs.com/saryli/p/9729591.html 插件转载:https://blog.csdn.net/nbdclw/article/details ...

  9. 聊一聊 Python 安装中的 --enable-shared

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 今天在 CentOS 7.4 使用源码编译安装 Python-2.7.15 的时候,发现了一个 ...

  10. 聊聊MAUI、WinUI3和WPF的优势及劣势

    今天在群里聊到WinUI3的学习及发展,还有他那堪比玩具的使用体验,正好梳理一篇关于WinUI3.MAUI和WPF优劣势,我整理的不是很好,所以又让ChatGPT在生成了一遍,感觉整体还可以.看完可以 ...