mysql 通过存储过程批量更新表数据

方法一:使用临时表批量更新表数据 (注意操作用户需要有mysql的创建临时表权限)

delimiter $$


# 删除 已有的 存储过程 
DROP PROCEDURE IF EXISTS update_user_account_method;  
# 创建新的存储过程 
CREATE PROCEDURE update_user_account_method()


-- 批量更新HIK+手机号
BEGIN


# 批量更新sx_为xs_
UPDATE sys_user  t
SET  t.account = REPLACE (t.account,'sx_','xs_'); 



# 创建临时表
 -- 不存在则创建临时表
 create temporary table if not exists tmp(id bigint(20) primary key,ac varchar(20) not null) ;
 -- 使用前先清空临时表
 truncate table tmp;  


# 查询HIK的账户数
SET @num=(SELECT COUNT(1) FROM sys_user WHERE  account like concat('%','HIK','%'));



# HIK的账户数大于0则执行
 if @num>0 then
 insert into tmp(id,ac) 
             SELECT user_id,random_num
             FROM (
                   SELECT user_id,concat('xs_',FLOOR(RAND()*50000000 + 50000000)) AS random_num  
                   FROM sys_user WHERE account like concat('%','HIK','%')
                  ) AS ss
             WHERE random_num NOT IN (SELECT account FROM sys_user);
 end if;
 


# 根据临时表更新表格对应的字段
UPDATE sys_user ,  tmp
  SET    sys_user.account = tmp.ac
  WHERE  sys_user.user_id = tmp.id;


# 使用后删除临时表
 drop table tmp;  


END $$
delimiter ;



# 执行存储过程
CALL update_user_account_method;


# 删除 已有的 存储过程 
DROP PROCEDURE  update_user_account_method;

方法二:使用游标批量更新表数据

 


delimiter //

# 删除已有的存储过程
DROP PROCEDURE IF EXISTS update_user_info;

-- 定义更新数据表存储过程
CREATE PROCEDURE update_user_info()

BEGIN
   -- 定义存储过程变量
   DECLARE userIds BIGINT(20);
   DECLARE accounts VARCHAR(32);
   DECLARE stopCur INT DEFAULT 0;
   -- 定义游标(更新指定部分数据)
   DECLARE cur CURSOR FOR (SELECT user_id,account FROM sys_user ORDER BY user_id LIMIT 60,3);
   -- 定义游标结束,当遍历完成时,将stopCur设置为null ,也可以写成 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET stopCur = null;
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET stopCur = null;
   
   -- 开游标 
   OPEN cur;
   -- 游标向下走一步,将查询出来的两个值赋给定义的两个变量
   FETCH cur INTO userIds,accounts;
      -- 循环体
      WHILE( stopCur IS NOT NULL) DO
      -- 更新对应关系表数据
      UPDATE driver SET email=accounts WHERE user_id = userIds ;
      -- 游标向下走一步
      FETCH cur INTO userIds,accounts;
      
      END WHILE;
   -- 关闭游标
   CLOSE cur;

END //
delimiter;

# 执行存储过程
CALL update_user_info;
 
# 删除 已有的 存储过程 
DROP PROCEDURE  update_user_info;

你可能感兴趣的:(mysql 通过存储过程批量更新表数据)