mysql:如何在执行update后返回受影响的数据

79 篇文章 10 订阅

环境:

  • window10
  • mysql 8.0.25
  • DBeaver

1. 问题

在sqlserver中,我们可以通过output关键字返回insertdeleteuptdate影响的行数(参照:《博文:sqlserver:使用output返回插入、删除的记录》),但mysql原生没有提供这种功能。

2. 解决办法

参考:《博文:MYSQL获取更新行的主键ID(更新返回所在行)》

首先,这是一个受限的解决办法,它要求这个表必须有主键,而且更新的时候不能更新主键!

先准备数据:

drop table if exists test
create table test(
	id int auto_increment primary key,
	name varchar(50),
	age int
)

insert into test(id,name,age) values
	(1,'刘备',40),
	(2,'关羽',38),
	(3,'张飞',36),
	(4,'诸葛亮',34);

select  *  from test

在这里插入图片描述
当我们执行单行更新时,可以使用如下:

SET @update_id := 0;
UPDATE test SET age = age + 1, id = (SELECT @update_id:= id)
WHERE age >39 and ( SELECT @uids := id ) is not null 
LIMIT 1; 
SELECT * from test where id=@update_id;

输出如下:
在这里插入图片描述

当我们执行多行更新时,可以使用如下:

SET @uids := null;
UPDATE test
   SET age = age+1
 WHERE age >35
   AND ( SELECT @uids := CONCAT_WS(',', id, @uids) ) is not null;

set @sql = CONCAT("select * from  test  where id in (",ifnull(@uids,'null'),")");

PREPARE stmt FROM @sql;
EXECUTE stmt ;
deallocate prepare stmt;

输出如下:
在这里插入图片描述

从上面的方案中,可以看出,我们是巧用了where里面的条件将要更新的主键值记录到了临时变量中,
所以,如果我们在更新时将主键也一块更新了,那就做不到输出了(注:除非使用触发器)。

3. 总结

其实,一般应用中,我们最多是返回insert的数据,很少去返回update后的数据的,更少有场景是更新主键值的,所以掌握上面的方法一般是够用的。

但我建议,最好没有这种应用的场景!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

jackletter

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

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

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

打赏作者

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

抵扣说明:

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

余额充值