关于使用mysql存储过程和触发器的结合

本文详细介绍了MySQL中如何使用存储过程和触发器进行数据操作,包括无参数返回ID的场景、根据插入数据获取区域ID的场景,以及在特定表操作后自动更新其他表数据的触发器应用实例。
摘要由CSDN通过智能技术生成

存储过程

应用场景

无传参,并返回结果(这里列举的是关于id自增)

场景:在某个表有insert操作时,往activity_business_info表中新增一条数据,并将insert操作中的id赋给activity_business_info的business_id

1.因为表activity_business_info的id不是自增的,所以这里需要创建一个函数来生成id

CREATE DEFINER=`root`@`%` FUNCTION `gene_long_id`() RETURNS bigint(20)#定义返回类型
BEGIN
DECLARE new_id BIGINT;#定义一个new_id的变量
SELECT MAX(id)+1 into new_id from activity_business_info;#查询最大id并+1
if new_id is null THEN #空值的判断
set new_id = 1;
END if;
RETURN new_id; #返回结果
END

有传参,并且返回查询结果

场景:在数据插入之前,根据insert数据中的"project_id",查到其所属的区域id(dept_id)和区域名称(dept_name)
CREATE DEFINER=`root`@`%` PROCEDURE `get_region_id`(IN `project_id` BIGINT(20),OUT region VARCHAR(255)) #in为传参变量和类型  out为返回变量和类型
BEGIN 
#这块写查询逻辑开始
select concat(dept_id,',',dept_name) from sys_dept ## 这里把区域id和区域名称做了一个拼接,不知道怎么返回两个值,所以就拼接一下 
where find_in_set(dept_id,
(select ancestors from sys_dept where pt_var_1 = `project_id` and del_flag = '0')
) 
and dept_type = 'region' 
and del_flag = '0';
#这块写查询逻辑结束
END

触发器(结合存储过程)

应用场景

场景1:在total_plan表新增之后再在activity_business_info表中插入一条数据,其中gene_long_id()是一个生成id的函数,在上面有展示;

create TRIGGER 触发器名称 after insert on total_plan
for each row
begin
insert into activity_business_info(id,business_id,business_table_name,task_status) values(gene_long_id(),NEW.id,'total_plan','5');
end;

场景2:在equipment_allot 表做insert操作之前,改变insert中的值

CREATE TRIGGER upd_region_allot BEFORE insert on equipment_allot 
for each row 
begin 
	declare newRegionId BIGINT(20); #定义变量
	declare newRegionName VARCHAR(255);
	select 
	#这里将查询到的结果赋值给定义的变量,注意只能有一个into
	dept_id,dept_name into newRegionId,newRegionName 
	from prj_to_region 
	where pt_var_1 = NEW.project_id limit 1;
	#这里就是将变量赋值给insert语句中了,NEW就是insert的对象
	set NEW.region_id = newRegionId;
	set NEW.region = newRegionName;
end;

场景3:在业务表执行删除操作的时候,根据业务表id 删除另一张表的数据(关联字段类型不一致,但是值一致)

CREATE TRIGGER del_act_demand AFTER DELETE ON total_demand FOR EACH ROW
BEGIN
#这里注意要用old,因为是删除的数据
delete from activity_business_info where business_id = (old.id); 
END;

一个具有注脚的文本。1


  1. 注脚的解释 ↩︎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值