环境:
- window10
- mysql 8.0.25
- DBeaver
1. 问题
在sqlserver中,我们可以通过output 关键字返回insert 、delete 、uptdate 影响的行数(参照:《博文: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后的数据的,更少有场景是更新主键值的,所以掌握上面的方法一般是够用的。
但我建议,最好没有这种应用的场景!
|