【MySQL】逐一更新数据(字段唯一)-存储过程

工作中遇到个问题,某一个字段要变成唯一,要对原表几千条数据进行修改,如何处理?

当然方法很多,可以用代码实现,用列表存所有id,然后for循环列表分别用id进行更新。

代码实现反而简单。如果用sql,需要使用游标。

游标可以 逐条读取 结果集中的数据。可以理解成Python种的迭代器,如[ a = 1 for a in list]等。

下面是代码

create procedure update_res()
BEGIN
	/*定义变量,需要则定义 变量名,变量类型,默认值*/
	declare no_record int DEFAULT 0;
	declare counter varchar(100);
	/*定义游标使用的变量,这个是必须的*/
	declare new_xxx varchar(100);
	/*必须,定义游标,名称随意 ,for 后跟的是任意的查询语句 */
	declare cur_xxx CURSOR FOR select id from table_a where xx_code = 'xx';
	/*条件判断,没找到则变量赋值为1 */
	declare continue handler for not found set no_record = 1;
	/*必须,OPEN 打开游标*/
	open cur_xxx;
	/*必须,游标指向第一行,同时游标写入变量 */
	fetch cur_xxx into new_xxx;
	/*必须,循环判断 */
	WHILE new_xxx != 1 DO
		/*赋值变量,这里直接用字符串+id(上面游标查的是id,也可以用其他的替代) */
		set counter = concat('abc',new_xxx)
		/*要循环的语句,这里用上面的变量更新字段,因为查的是id 所以也保证了此字段唯一 */
		update table_a set res_xxx = counter where id = new_xxx;
		/*一次循环执行完成后取下一个游标 */
		FETCH  cur_record INTO akey;
	/**必须,结束循环 */
	END WHILE;
	/*必须,最后释放游标 */
	CLOSE  cur_xxx;  
END

调用、删除

/*调用存储过程 */
call update_res();
/*删除存储过程 */
drop procedure if exists update_res;

本文参照了MySql 循环执行语句,循环执行update,详细介绍【游标嵌套】_mysql 循环update-CSDN博客

游标介绍参考

https://zhuanlan.zhihu.com/p/473517036

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

兴焉

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

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

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

打赏作者

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

抵扣说明:

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

余额充值