mysql存储过程批量更新千万数据_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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值