自学内容网 自学内容网

【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


原文地址:https://blog.csdn.net/qq_39803142/article/details/142559905

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!