MySQL触发器的使用


Posted in MySQL onMay 24, 2021

触发器可以在执行语句前或执行后触发其他 SQL 代码运行。触发器可以读取触发语句改变了哪些数据,但是没有返回值。因此可以使用触发器加强业务逻辑的约束而不需要在应用程序写对应的代码。

从上述描述可以看到,触发器可以简化应用程序的逻辑并且可以提升性能,这是因为使用触发器减少了应用程序和服务端的交互次数。同时,触发器有助于完成自动更新归一化和统计数据。例如,我们可以使用触发器自动统计交易订单总金额,订单数及平均客单价。 然而,MySQL 的触发器的应用场合也十分有限,如果你使用过其他数据库产品的触发器,不要以为 MySQL 也能实现相同的功能,例如:

  • 每个数据表的单一事件只能有一个触发器,也就是说对于 AFTER INSERT 这样的事件来说,不能同时有超过1个的触发器。
  • MySQL 只支持行级别的触发器,也就是只能按 FOR EACH ROW 这种方式使用触发而不是整个 SQL 语句,这对于大量数据的操作而言会比较低效。MySQL 的触发器只能按下面的形式编写:
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
    执行语句列表;
END

执行语句列表支持单条或多条语句,下面是一个多条语句的示例:

DELIMITER $$
CREATE TRIGGER user_create_log AFTER INSERT ON t_users FOR EACH ROW
BEGIN
DECLARE log_info VARCHAR(40)character set utf8;
DECLARE description VARCHAR(20) character set utf8;#后面发现中文字符编码出现乱码,这里设置字符集
SET description = " is created";
SET log_info = CONCAT(NEW.user_name, description);     #函数CONCAT可以将字符串连接
INSERT INTO logs(log) values(log_info);
END $$

DELIMITER ;
  • 触发器可能导致服务端实际执行的工作不可预测,一个简单的语句可能导致服务端做大量不可见的工作。例如,如果一个触发器更新了 一个相关的表,可能导致受影响的行数加倍。
  • 触发器难以调试,并且一旦引入了触发器,很难分析性能瓶颈。
  • 触发器会导致潜在的锁等待和死锁。如果触发器失败了,源查询也会失败。如果没有意识到触发器的存在,这类玩呢提很难发现。

大多数限制中,最大的限制是 FOR EACH ROW 的设计,这有时候导致触发器没法用于维护统计和缓存表,这是因为这可能很慢。使用触发器的主要理由是相比定时同步更新,触发器可以一致保持数据的一致性。 触发器也没法保证原子性。例如,更新 MyISAM 数据表的触发器在源 SQL 语句出错后,无法回滚。而且,触发器自身也可能都只错误。如果我们使用了 AFTER UPDATE 基于 MyISAM 数据表去更新另一个表。如果触发器有个导致第二张表操作失败的错误,那对于第一张表的操作不会回滚。

InnoDB 的触发器相关的操作,包括源语句都在同一个事务中,因此是满足原子性的。然而,如果使用InnoDB 的触发器去与另一张表校验数据一致性的时候,这个时候如果不小心的话可能导致不正确的结果。例如,假设需要使用触发器模拟外键,可以使用 BEFORE INSERT触发器验证另一张表是否存在对应的记录,但是如果在触发器读取另一张表数据的时候不使用 SELECT FOR UPDATE的话,则由于并发性性问题可能导致错误的结果。 虽然触发器有些缺陷,但是这并不意味着不能用。相反,触发器本身也是有用的,尤其是对于约束,系统维护任务和保持统计数据保持最新。

也可以使用触发器记录数据行的变化。这样即便是离线手动操作数据库的记录(如修复错误数据)也能够被记录下来。但是,需要注意的是对于往其他自增主键表插入数据时要小心,这对于复制性的语句表现会有问题,因为自增值对于两个相同的副本值并不同。

结语:

触发器在有限的场合能够发挥其优势,比如统计数据、数据表变更日志等。但是也会有一些缺陷,比如大数据量的更新由于逐行触发,会降低效率。还有就是,MyISAM 引擎无法保障原子性。因此,要根据应用场景是否要是有触发器。

以上就是MySQL触发器的使用的详细内容,更多关于MySQL触发器的资料请关注三水点靠木其它相关文章!

MySQL 相关文章推荐
MySQL基础(一)
Apr 05 MySQL
MySQL触发器的使用
May 24 MySQL
MySQL开启事务的方式
Jun 26 MySQL
浅谈MySQL之select优化方案
Aug 07 MySQL
Mysql关于数据库是否应该使用外键约束详解说明
Oct 24 MySQL
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
Dec 06 MySQL
利用JuiceFS使MySQL 备份验证性能提升 10 倍
Mar 17 MySQL
MySQL表锁、行锁、排它锁及共享锁的使用详解
Apr 02 MySQL
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
Apr 09 MySQL
MySQL创建管理KEY分区
Apr 13 MySQL
mysql中如何用命令创建联合唯一索引
Apr 20 MySQL
mysql数据库隔离级别详解
Jun 16 MySQL
MySQL 重命名表的操作方法及注意事项
May 21 #MySQL
Mysql官方性能测试工具mysqlslap的使用简介
May 21 #MySQL
MySQL官方导出工具mysqlpump的使用
May 21 #MySQL
新手必备之MySQL msi版本下载安装图文详细教程
MySQL数据库压缩版本安装与配置详细教程
MySQL 8.0 之不可见列的基本操作
May 20 #MySQL
Mysql Online DDL的使用详解
May 20 #MySQL
You might like
PHP设置进度条的方法
2015/07/08 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
通过Javascript读取本地Excel文件内容的代码示例
2014/04/08 Javascript
js中this的用法实例分析
2015/01/10 Javascript
ECMAScript6中Set/WeakSet详解
2015/06/12 Javascript
基于javascript实现彩票随机数生成(升级版)
2020/04/17 Javascript
jQuery实现获取table表格第一列值的方法
2016/03/01 Javascript
vue-resource 拦截器使用详解
2017/02/21 Javascript
Vue.js实现移动端短信验证码功能
2017/03/29 Javascript
原生js实现公告滚动效果
2021/01/10 Javascript
js中call()和apply()改变指针问题的讲解
2019/01/17 Javascript
vue父子组件间引用之$parent、$children
2020/05/20 Javascript
webpack+express实现文件精确缓存的示例代码
2020/06/11 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
2020/07/17 Javascript
关于vue-cli3打包代码后白屏的解决方案
2020/09/02 Javascript
[01:02:53]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第二局
2016/03/06 DOTA
[53:23]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
[00:14]护身甲盾
2019/03/06 DOTA
10款最好的Web开发的 Python 框架
2015/03/18 Python
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
pygame学习笔记(2):画点的三种方法和动画实例
2015/04/15 Python
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
2020/02/06 Python
django xadmin 管理器常用显示设置方式
2020/03/11 Python
Python 统计位数为偶数的数字代码详解
2020/03/15 Python
Django Admin 上传文件到七牛云的示例代码
2020/06/20 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
2020/11/01 Python
英国文具、办公用品和科技商店:Ryman
2018/09/27 全球购物
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
英国第一的滑雪服装和装备零售商:Snow+Rock
2020/02/01 全球购物
学生请假条格式
2014/04/11 职场文书
新教师教学工作总结
2015/08/12 职场文书
2016大一新生军训心得体会
2016/01/11 职场文书
严以用权学习心得体会
2016/01/12 职场文书
医学会议开幕词
2016/03/03 职场文书
MySQL 视图(View)原理解析
2021/05/19 MySQL