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 相关文章推荐
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
Apr 05 MySQL
解决MySQL存储时间出现不一致的问题
Apr 28 MySQL
MySQL 数据丢失排查案例
May 08 MySQL
MySQL系列之六 用户与授权
Jul 02 MySQL
MySQL深度分页(千万级数据量如何快速分页)
Jul 25 MySQL
MySQL中CURRENT_TIMESTAMP的使用方式
Nov 27 MySQL
mysql5.6主从搭建以及不同步问题详解
Dec 04 MySQL
MySQL实战记录之如何快速定位慢SQL
Mar 23 MySQL
mysql使用 not int 子查询隐含陷阱
Apr 12 MySQL
MySQL数据库简介与基本操作
May 30 MySQL
MySQL中dd::columns表结构转table过程及应用详解
Sep 23 MySQL
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
Dec 24 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
Terran剧情介绍
2020/03/14 星际争霸
PHP加速 eAccelerator配置和使用指南
2009/06/05 PHP
php返回当前日期或者指定日期是周几
2015/05/21 PHP
PHP实现恶意DDOS攻击避免带宽占用问题方法
2015/05/27 PHP
深入浅析安装PhpStorm并激活的步骤详解
2020/09/17 PHP
js中查找最近的共有祖先元素的实现代码
2010/12/30 Javascript
用JS判断IE版本的代码 超管用!
2011/08/09 Javascript
13 款最热门的 jQuery 图像 360 度旋转插件推荐
2014/12/09 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
2015/12/08 Javascript
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
webpack中引用jquery的简单实现
2016/06/08 Javascript
Ajax分页插件Pagination从前台jQuery到后端java总结
2016/07/22 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
2016/09/08 Javascript
jquery心形点赞关注效果的简单实现
2016/11/14 Javascript
js正则表达式验证密码强度【推荐】
2017/03/03 Javascript
jquery获取select,option所有的value和text的实例
2017/03/06 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
Javascript刷新页面的实例
2017/09/23 Javascript
JavaScript模板引擎应用场景及实现原理详解
2018/12/14 Javascript
jquery实现动态创建form并提交的方法示例
2019/05/27 jQuery
浅谈react-router@4.0 使用方法和源码分析
2019/06/04 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
JavaScript this关键字指向常用情况解析
2020/09/02 Javascript
[01:16]DOTA2小知识课堂 Ep.03 芒果树无伤肉山
2019/12/05 DOTA
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
Python 给屏幕打印信息加上颜色的实现方法
2019/04/24 Python
django中账号密码验证登陆功能的实现方法
2019/07/15 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
使用HTML5拍照示例代码
2013/08/06 HTML / CSS
印尼旅游网站:via
2017/11/12 全球购物
会计岗位职责
2013/11/08 职场文书
保安拾金不昧表扬信
2014/01/15 职场文书
工作简报范文
2015/07/21 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书
创业计划书之烤红薯
2019/09/26 职场文书