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;
# 删除 已有的 存储过程批量更新sql语句
DROP PROCEDURE update_user_info;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论