MYSQL的触发器

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

触发器类型

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

语法

创建

CREATE TRIGGER trigger_name
BEFORE/AFTER INSERT/UPDATE/DELETE
ON tbl_name FOR EACH ROW -- 行级触发器
BEGIN
    trigger_stmt ;
END;

查看

SHOW TRIGGERS ;

删除

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

案例

通过触发器记录 tb_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;

插入数据触发器

创建 

-- 准备工作 : 日志表 user_logs
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;
测试
-- 查看
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());

触发插入数据

修改数据触发器

创建 

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;

测试

-- 查看
show triggers ;
-- 更新
update tb_user set profession = '会计' where id = 23;

 触发更新数据

删除数据触发器

创建 

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;

 测试

-- 查看
show triggers ;

-- 删除数据
delete from tb_user where id = 26;

触发删除数据 

更多推荐

NotePad++ 在行前/行后添加特殊字符内容方法

我们在处理数据时,会遇到需要在每行数据前面、后面、开头、结尾添加各种不一样的字符如果数据不多,我们可以自己手动的去添加,但如果达到了成百上千行,此时再机械的手动添加是不现实的这里教给大家如何快速的在数据每行的前后加不同的字符(任何汉字、字母、符号都可以)首先下载一个Notepad++(相信各位不会陌生,比自带的记事本强

Pytorch中张量矩阵乘法函数(mm, bmm, matmul)使用说明,含高维张量实例及运行结果

Pytorch中张量矩阵乘法函数使用说明1torch.mm()函数1.1torch.mm()函数定义及参数1.2torch.bmm()官方示例2torch.bmm()函数2.1torch.bmm()函数定义及参数2.2torch.bmm()官方示例3torch.matmul()函数3.1torch.matmul()函数

Git使用方法与IDEA集成Git

1.Git介绍1.1版本控制(理解)无论是代码编写,还是文档编写,我们都会遇到对文档内容反复修改的情况。1.2开发中存在的问题(理解)程序员小明负责的模块就要完成了,就在即将提交发布之前的一瞬间,电脑突然蓝屏,硬盘光荣下岗!几个月来的努力付之东流​老王需要在项目中加入一个很复杂的功能,一边尝试,一边修改代码,就这样摸索

C++:vector

目录vector的模拟实现一.初定义二.相关功能2.1迭代器2.2capacity1.size2.capacity3.reserve(扩容)4.resize2.3access2.4modify1.push_back2.pop_back3.empty4.swap5.insert6.erase2.5构造函数与析构函数1.构

UDP与TCP报头介绍,三次握手与四次挥手详谈

先介绍我们UDP/TCP协议缓冲区在UDP和TCP在数据传输和介绍时有有缓冲区概念的。UDP缓冲区UDP没有真正意义上的发送缓冲区.调用sendto会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作;UDP具有接收缓冲区.但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;如果缓冲区满了,

【C进阶】指针和数组笔试题解析

做题之前我们先来回顾一下对于数组名的理解:除了以下两种情况,数组名表示的都是数组首元素的地址(1)sizeof(数组名):这里的数组名表示整个数组(2)&(数组名):这里的数组名也表示整个数组一、一维数组inta[]={1,2,3,4};printf("%d\n",sizeof(a));printf("%d\n",si

如何在Blender中压缩/减小GLTF模型的大小

GLTF如何在Blender中压缩/减小GLTF模型的大小Blender是一款功能强大的开源软件,旨在创建3D图形,动画和视觉效果。它支持多种文件格式的导入和导出,包括GLB,GLTF,DAE,OBJ,ABC,USD,BVH,PLY,STL,FBX和X3D。这种适应性使其成为各种3D项目和工作流程的宝贵工具。(http

使用ChatGPT和Blender绘制金色球的完整指南

简介:在本篇博客中,我们将了解如何结合使用ChatGPT和Blender来创建一个金色的球体。ChatGPT是OpenAI开发的强大自然语言处理模型,而Blender则是一款流行的3D建模和渲染软件。通过结合这两个工具,您可以获得详细的指导,帮助您在Blender中绘制一个逼真的金色球体。第一步:准备工作确保您已经安装

【Shell学习笔记】Bash的模式扩展

简介Shell接收到用户输入的命令以后,会根据空格将用户的输入,拆分成一个个词元(token)。然后,Shell会扩展词元里面的特殊字符,扩展完成后才会调用相应的命令。这种特殊字符的扩展,称为模式扩展(globbing)。其中有些用到通配符,又称为通配符扩展(wildcardexpansion)。Bash一共提供八种扩

LabVIEW使用巴特沃兹低通滤波器过滤噪声

LabVIEW使用巴特沃兹低通滤波器过滤噪声设备采集到的数据往往都有噪声,有时候这些数据要做判断使用,如果不处理往往会影响最终的结果。可以使用动态平滑,或者中值滤波等方法。这里介绍使用巴特沃斯低通滤波,也是非常方便的。下图是一个典型的使用巴特沃兹低通滤波的应用。Raw为含有噪声的原始数据,Filtered为过滤后的数据

Redis缓存相关问题

目录缓存穿透缓存雪崩缓存击穿Redis集群方案主从复制Replication哨兵sentinel高可用介绍Redissentinel介绍Redissentinel使用配置sentinel启动sentinel测试sentinelRedis内置集群clusterRediscluster介绍哈希槽方式分配数据Redisclu

热文推荐