【MySQL 数据库】10、MySQL 的触发器

文章介绍了MySQL中的存储函数和触发器。存储函数是具有返回值的存储过程,用于计算累加和等。触发器则是在数据表操作(insert,update,delete)前后执行的SQL语句集合,用于保证数据完整性,如记录tb_user表的数据变更日志到user_logs表。示例展示了如何创建和使用insert、update、delete触发器来记录操作日志。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

零、存储函数

  • 存储函数是有返回值的存储过程
  • 存储函数的参数只能是 IN 类型

在这里插入图片描述

characteristic 说明:
① DETERMINISTIC:相同的输入参数总是产生相同的结果
② NO SQL :不包含 SQL 语句
③ READS SQL DATA:包含读取数据的语句,不包含写入数据的语句


🌼 用存储函数求 1~n 的累加和

# 输入参数不能写【in】,会报错
# create function sum_func(in n int) # 会报错
create function sum_func(n int) # RIGHT
returns int DETERMINISTIC
begin
	declare sum int default 0;
	
	while(n > 0) do
	 set sum := sum + n;
	 set n := n - 1;
 end while;
 
 return sum;
end;

# 调用存储函数
select sum_func(100);

一、触发器

  • 触发器是与表有关的数据库对象,指在 insert/update/delete 之前 (BEFORE) 或之后 (AFTER),触发并执行触发器中定义的 SQL 语句集合
  • 触发器的这种特性可以协助应用在数据库端确保数据的完整性日志记录数据校验等操作
  • 使用别名 OLDNEW 可引用触发器中发生变化的记录
  • 现在触发器还只支持行级触发,不支持语句级触发

在这里插入图片描述

二、触发器的使用和语法

在这里插入图片描述


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

insert 触发器:

# 创建触发器(insert)
create trigger tb_user_insert_trigger 
after insert on tb_user for each row
begin
	insert into user_logs values (null, 'insert', now(), new.id, concat(new.id, '_,_', new.name, '_,_', new.email));
end;

# 查看触发器
show triggers;

select * from user_logs;

insert into tb_user values (null, '陈铭酒', '19111658988', '3656585555@qq.com', '医学', 25, '男', 6, now());

update触发器:

# 查看触发器
show triggers;  

drop trigger tb_user_update_trigger;
# 创建触发器(update)
create trigger tb_user_update_trigger 
after update on tb_user for each row
begin
	insert into user_logs values (null, 'update', now(), new.id, concat('前: profession=', old.profession, 
	' 后:', 'profession=', new.profession));
end;

update tb_user set profession = '肿瘤学' where `name` = '陈铭酒';

update tb_user set profession = '母猪产后护理' where id >= 20;

delete 触发器:

# 创建触发器(delete)
create trigger tb_user_delete_trigger 
after delete on tb_user for each row
begin
	insert into user_logs values (null, 'delete', now(), old.id, concat('被删除: name=', old.name));
end;
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张国庆Jagochan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值