当前位置: 首页 > news >正文

mysql开发之---使用游标双层嵌套对总表进行拆分为帖子表和回复表

注意点:

(1)进行拆分的总表表名是不同的。所以创建暂时表,把总表的数据先插入暂时表

(2)为了避免最外层游标轮询数据结束时,抛出 not found 退出程序,不会运行关闭游标等兴许操作,定义continue handler。 declare continue handler for not found set done1=1;


1.1、外部存储过程调用主存储过程

CREATE PROCEDURE `bbs_split_thread_post_outer`(IN `in_tabname` varchar(128))
BEGIN
declare v_row_count int(11);
declare v_sql varchar(200);

-- 必须清空暂时表bbs_fromask_importask_tmp
select sysdate();
truncate table bbs_fromask_importask_tmp;


set @sql=concat('insert into bbs_fromask_importask_tmp select * from ',in_tabname,';');
prepare stmt from @sql;
execute stmt;

call bbs_split_thread_post();


select sysdate();
END


CREATE PROCEDURE `bbs_split_thread_post`()
BEGIN
declare v_source_count int(11);
declare v_thread_pkid int(11);
declare v_thread_pkid_uni_count int(11);
  declare done1,done2 int default 0;
declare v_cur_thread_pkid cursor for select pkid,count(*) from bbs_fromask_importask_tmp group by pkid;
declare continue handler for not found set done1=1;


-- 清空暂时表
truncate table pre_data_thread_tmp;
truncate table pre_data_post_tmp;

-- 推断原表是否有数据,没有什么也不做
select count(*) into v_source_count from bbs_fromask_importask_tmp;
if v_source_count>0 then
    select ifnull(max(id),0) into @thread_max_id from yaolanbbs.pre_data_thread; -- 可做改动
  select @thread_max_id;
 
  -- 打开游标
  open v_cur_thread_pkid;
  repeat
  fetch v_cur_thread_pkid into v_thread_pkid,v_thread_pkid_uni_count;
  -- 每次fetch最大id自增1
  if not done1 then
  set @thread_max_id=@thread_max_id+1;
  insert into pre_data_thread_tmp(id,title,age,rule,param)
  select @thread_max_id,t1.qtitle,t1.age,'age',t1.age from bbs_fromask_importask_tmp t1 where t1.pkid=v_thread_pkid limit 1;
  -- 依据pkid对一组数据进行处理
  begin
  declare v_post_answer text;
  declare v_cur_post_record cursor for select t1.answer from bbs_fromask_importask_tmp t1 where t1.pkid=v_thread_pkid;
  declare exit handler for not found close v_cur_post_record;
  -- declare continue handler for not found set done2=1;
 
  insert into pre_data_post_tmp(tid,text,sort)
  select @thread_max_id,t1.qdesc,1 from bbs_fromask_importask_tmp t1 where t1.pkid=v_thread_pkid limit 1;
 
  set @sort=2; ######设置值
  open v_cur_post_record;
  repeat 
  fetch v_cur_post_record into v_post_answer;
   -- select @sort;
  -- select v_post_answer;
  insert into pre_data_post_tmp(tid,text,sort) values(@thread_max_id,v_post_answer,@sort);
  -- insert into testincre values(@sort,v_post_answer);
  set @sort=@sort+1;
  until 0 end repeat;
  -- select curdate(); 不会运行的原因。定义exit handler
  close v_cur_post_record;
  end;
  end if;
  until done1 end repeat;
  -- 关闭游标
  close v_cur_thread_pkid;
  -- select curdate();
  /*-- 导入终于表
  insert into pre_data_thread(id,title,create_time,age,rule,param)
  select id,title,create_time,age,rule,param from pre_data_thread_tmp;
  insert into pre_data_post(tid,text,sort,create_time)
  select tid,text,sort,create_time from pre_data_post_tmp;
*/
end if;
END


总结:

(1)30G内存没有负载的情况下。8488276行拆为两个表共10500000行用时39分钟

drop procedure if exists if_var_inner_updated_swap;
create procedure `if_var_inner_updated_swap`()
begin

declare ind int (8);

declare update_status char (10);

declare swap_status char (10);


select
id
from
datalogic_var_inner_update_swap_log
where
task_name = "datalogic_var_inner_apply_hist_uuid_01_backup"
and task_date = curdate() into ind;

select
task_update_status
from
datalogic_var_inner_update_swap_log
where
id = ind into update_status;

select
task_swap_status
from
datalogic_var_inner_update_swap_log
where
id = ind into swap_status;

if (
update_status = 'finished'
and swap_status =0
) then
rename table datalogic_var_inner_apply_hist_uuid_01 to datalogic_var_inner_apply_hist_uuid_01_temp,
datalogic_var_inner_apply_hist_uuid_01_backup to datalogic_var_inner_apply_hist_uuid_01,
datalogic_var_inner_apply_hist_uuid_01_temp to datalogic_var_inner_apply_hist_uuid_01_backup;

update datalogic_var_inner_update_swap_log
set task_swap_status = '1'
where
id = ind;
end if;

end

相关文章:

  • window 下安装 wget 命令
  • V8 Ignition:JS 引擎与字节码的不解之缘
  • centos安装vsftp
  • 【zabbix系列】安装与加入host
  • 【Sets】使用Google Guava工程中Sets工具包,实现集合的并集/交集/补集/差集
  • JAVA多线程入门
  • 20145223 杨梦云 《网络对抗》 Web基础
  • ionic入门之数据绑定显示-1
  • TFS 测试用例导入、导出工具
  • IntelliJ IDEA搭建SpringBoot
  • Hadoop OutputFormat浅析
  • php7 安装yar 生成docker镜像
  • 闪屏完善
  • vSphere
  • sed awk 练习
  • hexo+github搭建个人博客
  • Docker 笔记(2):Dockerfile
  • emacs初体验
  • JavaScript对象详解
  • Javascript基础之Array数组API
  • JavaScript中的对象个人分享
  • JS专题之继承
  • Otto开发初探——微服务依赖管理新利器
  • Python学习笔记 字符串拼接
  • python学习笔记-类对象的信息
  • Python学习之路16-使用API
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 离散点最小(凸)包围边界查找
  • 强力优化Rancher k8s中国区的使用体验
  • 区块链共识机制优缺点对比都是什么
  • 收藏好这篇,别再只说“数据劫持”了
  • 新版博客前端前瞻
  • 浅谈sql中的in与not in,exists与not exists的区别
  • 数据库巡检项
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (SpringBoot)第七章:SpringBoot日志文件
  • (八)c52学习之旅-中断实验
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)Mysql的优化设置
  • (转)Unity3DUnity3D在android下调试
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .Net - 类的介绍
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .Net中wcf服务生成及调用
  • @Bean有哪些属性
  • [ Linux ] Linux信号概述 信号的产生
  • []串口通信 零星笔记
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大