⑩⑥ 【MySQL】详解 触发器TRIGGER,协助 确保数据的完整性,日志记录,数据校验等操作。

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: ⑩⑥ 【MySQL】详解 触发器TRIGGER,协助 确保数据的完整性,日志记录,数据校验等操作。


⑩⑥ 【MySQL】触发器详解


1. 什么是触发器

触发器

  • 触发器是与表有关的数据库对象 ,指在insert / update / delete之前或之后 ,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性日志记录数据校验等操作。
  • 使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发不支持语句级触发
  • 行级触发:执行insert / update / delete语句,影响5行数据,触发器会被触发5次。
  • 语句级触发:执行insert / update / delete语句,影响n行数据,触发器只触发1次。


触发器类型

  • INSERT 触发器NEW 表示将要或已经新增的数据。
  • UPDATE 触发器OLD 表示修改之前的数据,NEW 表示将要或已经修改后的数据。
  • DELETE 触发器:OLD表示将要或已经删除的数据。




2. 触发器的使用

①使用规则

使用触发器

  • 🚀创建触发器
-- 语法:
-- {}内的关键字为必选项,任选其一。
-- BEFORE/AFTER表示触发SQL语句的时机,在新增/修改/删除操作之前/之后
CREATE TRIGGER 触发器名
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON 表名 FOR EACH ROW
BEGIN
  -- 触发后执行的SQL语句
END;


  • 🚀查看触发器
SHOW TRIGGERS;


  • 🚀删除触发器
-- 若不指定schema_name,默认当前数据库
DROP TRIGGER [schema_name.]触发器名


②案例

准备工作

  • 通过触发器记录 user 表的数据变更日志(user_logs) | 包含增加, 修改 , 删除
-- 需求: 通过触发器记录 user 表的数据变更日志(user_logs) , 包含增加, 修改 , 删除 ;
-- 准备工作 : 日志表 user_logs
create table user_logs(
  id int(11) not null auto_increment,
  operation varchar(20) not null comment '操作类型, insert/update/delete',
  operate_time datetime not null comment '操作时间',
  operate_id int(11) not null comment '操作的ID',
  operate_params varchar(500) comment '操作参数',
  primary key(`id`)
)engine=innodb default charset=utf8;


INSERT触发器 案例

-- 插入数据触发器
DELIMITER $$
CREATE TRIGGER tb_user_insert_trigger
AFTER INSERT 
ON tb_user FOR EACH ROW
BEGIN
    INSERT INTO user_logs(id, operation, operate_time, operate_id, operate_params) VALUES
    (NULL, 'insert', NOW(), new.id, CONCAT('插入的数据内容为: id=',new.id,',name=',new.name, ', phone=', NEW.phone, ', email=', NEW.email, ', profession=', NEW.profession));
END$$
DELIMITER ;
-- 查看触发器
SHOW TRIGGERS ;
-- 插入数据到tb_user
INSERT INTO tb_user(id, NAME, phone, email, profession, age, gender, STATUS, createtime) VALUES 
(26,'三皇子','18809091212','erhuangzi@163.com','软件工程',23,'1','1',NOW());
-- 查看触发器触发后的日志表
SELECT * FROM user_logs;
-- 删除触发器
drop trigger tb_user_insert_trigger;


UPDATE触发器 案例

-- 修改数据触发器
DELIMITER $$
CREATE TRIGGER tb_user_update_trigger
AFTER UPDATE 
ON tb_user FOR EACH ROW
BEGIN
    INSERT INTO user_logs(id, operation, operate_time, operate_id, operate_params) VALUES
    (NULL, 'update', NOW(), new.id,
        CONCAT('更新之前的数据: id=',old.id,',name=',old.name, ', phone=', old.phone, ', email=', old.email, ', profession=', old.profession,
            ' | 更新之后的数据: id=',new.id,',name=',new.name, ', phone=', NEW.phone, ', email=', NEW.email, ', profession=', NEW.profession));
END$$
DELIMITER ;
-- 查看触发器
SHOW TRIGGERS ;
-- 执行更新操作
UPDATE tb_user SET profession = '会计' WHERE id = 23;
UPDATE tb_user SET profession = '会计' WHERE id <= 5;
-- 查看触发器触发后的日志表
SELECT * FROM user_logs;


DELETE触发器 案例

-- 删除数据触发器
DELIMITER $$
CREATE TRIGGER tb_user_delete_trigger
AFTER DELETE 
ON tb_user FOR EACH ROW
BEGIN
    INSERT INTO user_logs(id, operation, operate_time, operate_id, operate_params) VALUES
    (NULL, 'delete', NOW(), old.id,
        CONCAT('删除之前的数据: id=',old.id,',name=',old.name, ', phone=', old.phone, ', email=', old.email, ', profession=', old.profession));
END$$
DELIMITER ;
-- 查看触发器
SHOW TRIGGERS ;




相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
10小时前
|
监控 NoSQL MongoDB
mongoDB查看数据的插入日志
【5月更文挑战第9天】mongoDB查看数据的插入日志
9 4
|
3天前
|
存储 关系型数据库 MySQL
MySQL是怎样存储数据的?
MySQL是怎样存储数据的?
|
4天前
|
SQL 关系型数据库 MySQL
这篇文章带你了解:如何一次性将Centos中Mysql的数据快速导出!!!
这篇文章带你了解:如何一次性将Centos中Mysql的数据快速导出!!!
|
4天前
|
存储 SQL 关系型数据库
MySQL的优化利器⭐️索引条件下推,千万数据下性能提升273%🚀
以小白的视角探究MySQL索引条件下推ICP的优化,其中包括server层与存储引擎层如何交互、索引、回表、ICP等内容
MySQL的优化利器⭐️索引条件下推,千万数据下性能提升273%🚀
|
5天前
|
存储 关系型数据库 MySQL
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
本篇文章来讨论MySQL字段的字符类型选择并深入实践char与varchar类型的区别以及在千万数据下的性能测试
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
|
6天前
|
关系型数据库 MySQL 数据管理
MySQL通过 bin-log 恢复从备份点到灾难点之间数据
MySQL通过 bin-log 恢复从备份点到灾难点之间数据
|
7天前
|
监控 NoSQL MongoDB
mongoDB查看数据的插入日志
【5月更文挑战第2天】mongoDB查看数据的插入日志
33 0
|
11天前
|
关系型数据库 MySQL 数据库
【MySQL-10】DCL-数据控制语言-【管理用户&权限控制】 (语法语句&案例演示&可cv案例代码)
【MySQL-10】DCL-数据控制语言-【管理用户&权限控制】 (语法语句&案例演示&可cv案例代码)
【MySQL-10】DCL-数据控制语言-【管理用户&权限控制】 (语法语句&案例演示&可cv案例代码)
|
11天前
|
SQL 关系型数据库 MySQL
【MySQL-7】DML的表操作详解:添加数据&修改数据&删除数据(可cv例题语句)
【MySQL-7】DML的表操作详解:添加数据&修改数据&删除数据(可cv例题语句)
|
5天前
|
C++
JNI Log 日志输出
JNI Log 日志输出
13 1