MySql数据库触发器使用教程


Posted in MySQL onJune 01, 2022

一、介绍

1、触发器是一种特殊的存储过程。触发器和存储过程一样,是一个能够完成特定功能、存储在数据库服务器上的SQL片段,但是触发器无语调用,当对数据库表中的数据执行DML操作时自动触发这个SQL片段的执行,无需手动调用。

2、在MySql中,只有执行insert,delete,update操作时才能触发触发器的执行

3、触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作

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

二、操作

1、表数据准备

# 用户表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for users
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users`  (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名',
  `sex` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '性别',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;


# 用户操作日志表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user_log
-- ----------------------------
DROP TABLE IF EXISTS `user_log`;
CREATE TABLE `user_log`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  `create_time` datetime(0) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

2、触发器格式

# 创建只有一个执行语句的触发器

create trigger 触发器名 before|after 触发事件
on 表名 for each row
执行语句;

# 创建有多个执行语句的触发器

create trigger 触发器名 before|after 触发事件
on 表名 for each row
begin  
   执行语句列表
end;

3、操作

drop TRIGGER if EXISTS TRIGGER_test;
-- 需求1:当users表添加一行数据,则会自动在user_log添加日志记录
delimiter $$
CREATE TRIGGER TRIGGER_test after INSERT
on users FOR EACH ROW
BEGIN
INSERT INTO user_log(content,create_time) VALUES('添加了一条数据',NOW());
end $$
delimiter ;

INSERT INTO users(user_name,sex) VALUES('xiaohemaio','男');


-- 需求2:当users表修改一行数据,则会自动在user_log添加日志记录
drop TRIGGER if EXISTS TRIGGER_test1;

delimiter $$
CREATE TRIGGER TRIGGER_test1  BEFORE UPDATE
on users FOR EACH ROW
BEGIN
INSERT INTO user_log(content,create_time) VALUES('修改了一条数据',NOW());
end $$
delimiter ;

update users set user_name='迪丽热巴' WHERE id=3;

三、触发器NEW和OLD的使用

MySql中定义了NEW和OLD,用来表示触发器的所在表中,触发了触发器的那一行数据,来引用触发器中发生变化的记录内容。

MySql数据库触发器使用教程

使用方法:NEW.columnName (columnName为相应数据表某一列名)

1、案例

-- 案例一
drop TRIGGER if EXISTS TRIGGER_test2;

delimiter $$
CREATE TRIGGER TRIGGER_test2 after INSERT
on users FOR EACH ROW
BEGIN
INSERT INTO user_log(content,create_time) VALUES(CONCAT('添加的用户信息为:',NEW.user_name,' 性别为:',NEW.sex ),NOW());
end $$
delimiter ;

INSERT INTO users(user_name,sex) VALUES('xiaohemaio','男');


-- 案例二 
drop TRIGGER if EXISTS TRIGGER_test3;

delimiter $$
CREATE TRIGGER TRIGGER_test3  BEFORE UPDATE
on users FOR EACH ROW
BEGIN
INSERT INTO user_log(content,create_time) VALUES(CONCAT('将:',OLD.user_name,' 修改为:',NEW.user_name ),NOW());
end $$
delimiter ;

update users set user_name='迪丽热巴' WHERE id=4;

-- 案例三
drop TRIGGER if EXISTS TRIGGER_test4;

delimiter $$
CREATE TRIGGER TRIGGER_test4  BEFORE DELETE
on users FOR EACH ROW
BEGIN
INSERT INTO user_log(content,create_time) VALUES(CONCAT('将id为:',OLD.user_name,' 已删除' ),NOW());
end $$
delimiter ;

DELETE FROM  users WHERE id=4;

MySql数据库触发器使用教程

四、其他操作

-- 查看触发器
SHOW TRIGGERS;

-- 删除触发器
drop TRIGGER if EXISTS 触发器名;

五、注意事项

1、触发器中不能对本表进行insert,update,delete操作,以免递归循环触发

2、尽量少使用 触发器,假设触发器触发每次执行1s,insert table 500条数据,那么就需要触发500次触发器,光是触发器执行的时间就花费了500s,而insert 500条数据一共是1s,那么这个insert 的效率就非常低了。

3、触发器是针对每一行的数据,对增删改非常频繁的表上切记不要使用触发器,因为非常消耗资源。

补充:验证触发器

向用户表users插入数据。

mysql> INSERT INTO users (userName, password, name, nickName, sex, email, isManager) VALUE ('itbilu', 'e10adc3949ba59abbe56e057f20f883e', 'IT笔录', 'itbilu', 1, 'cn.liuht@gmail.com', 0);

users原来没有数据,刚插入的数据userId为1。向用户表角色表userRoles插入数据,使触发器触发:

mysql> INSERT INTO userRoles (userId, roleId) VALUE (1, 1);

刚才插入的数据已经使触发器触发,查看结果如下:

mysql> select isManager from users;
+-----------+
| isManager |
+-----------+
|         1 |
+-----------+

总结

到此这篇关于MySql数据库触发器使用的文章就介绍到这了,更多相关MySql触发器使用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

MySQL 相关文章推荐
详解MySQL InnoDB存储引擎的内存管理
Apr 08 MySQL
MySQL 数据丢失排查案例
May 08 MySQL
详解Mysql和Oracle之间的误区
May 18 MySQL
MySQL中distinct和count(*)的使用方法比较
May 26 MySQL
MySQL GRANT用户授权的实现
Jun 18 MySQL
MySQL开启事务的方式
Jun 26 MySQL
一篇文章带你深入了解Mysql触发器
Aug 02 MySQL
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
Aug 23 MySQL
解决MySQL Varchar 类型尾部空格的问题
Apr 06 MySQL
mysql查找连续出现n次以上的数字
May 11 MySQL
MySQL安装失败的原因及解决步骤
Jun 14 MySQL
Mysql表数据比较大情况下修改添加字段的方法实例
Jun 28 MySQL
MySQL选择合适的备份策略和备份工具
MySQL普通表如何转换成分区表
May 30 #MySQL
Mysql将字符串按照指定字符分割的正确方法
May 30 #MySQL
MySQL数据库安装方法与图形化管理工具介绍
MySQL数据库简介与基本操作
May 30 #MySQL
Mysql数据库事务的脏读幻读及不可重复读详解
May 30 #MySQL
mysql字段为NULL索引是否会失效实例详解
May 30 #MySQL
You might like
php对文件进行hash运算的方法
2015/04/03 PHP
php将图片文件转换成二进制输出的方法
2015/06/10 PHP
PHP7 新特性详细介绍
2016/09/06 PHP
php 生成Tab键或逗号分隔的CSV
2016/09/24 PHP
PhpSpreadsheet设置单元格常用操作汇总
2020/11/13 PHP
Thinkphp极验滑动验证码实现步骤解析
2020/11/24 PHP
js 替换功能函数,用正则表达式解决,js的全部替换
2010/12/08 Javascript
面向对象的Javascript之三(封装和信息隐藏)
2012/01/27 Javascript
javascript检测页面是否缩放的小例子
2013/05/16 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
javascript设计模式--策略模式之输入验证
2015/11/27 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
JS中位置与大小的获取方法
2016/11/22 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
详解JavaScript对象的深浅复制
2017/03/30 Javascript
vue 属性拦截实现双向绑定的实例代码
2018/10/24 Javascript
js实现单元格拖拽效果
2020/02/10 Javascript
解决ant Design中this.props.form.validateFields未执行的问题
2020/10/27 Javascript
[01:20]2018DOTA2亚洲邀请赛总决赛战队Mineski晋级之路
2018/04/07 DOTA
python中二维阵列的变换实例
2014/10/09 Python
栈和队列数据结构的基本概念及其相关的Python实现
2015/08/24 Python
全面了解Python环境配置及项目建立
2016/06/30 Python
Python爬取APP下载链接的实现方法
2016/09/30 Python
Python自定义函数定义,参数,调用代码解析
2017/12/27 Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
2018/02/24 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
2018/04/19 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
HTML5实现签到 功能
2018/10/09 HTML / CSS
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的
2015/07/24 面试题
数控技校生自我鉴定
2014/03/02 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
观后感格式
2015/06/19 职场文书
CSS3 天气图标动画效果
2021/04/06 HTML / CSS
在CSS中映射鼠标位置并实现通过鼠标移动控制页面元素效果(实例代码)
2021/04/22 HTML / CSS