【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