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
mysql开发之---使用游标双层嵌套对总表进行拆分为帖子表和回复表的更多相关文章
- 第一篇:Win10系统搭建Python+Django+Nginx+MySQL 开发环境详解(完美版)
		
Win10+Python+Django+Nginx+MySQL 开发环境搭建详解 PaulTsao 说明:本文由作者原创,仅供内部参考学习与交流,转载引用请注明出处,用于商业目的请联系作者本人. Wi ...
 - MySQL开发指南
		
数据库开发是数据库管理系统(DBMS)和数据库应用软件设计研发的总称,数据运维.参与数据库生产环境的问题优化和解决等方面的事宜. 1.关于MySQL数据库 2.搭建MySQL环境 3.入门常用SQL. ...
 - MySQL(8)---游标
		
Mysql(8)-游标 上一遍博客写了有关存储过程的语法知识 Mysql(7)---存储过程 游标或许你在工作中很少用到,但用不到不代表不去了解它,但你真正需要它来解决问题的时候,再花时间去学习很可能 ...
 - 使用FragmentTabHost+TabLayout+ViewPager实现双层嵌套Tab
		
大多数应用程序都会在底部使用3~5个Tab对应用程序的主要功能进行划分,对于一些信息量非常大的应用程序,还需要在每个Tab下继续划分子Tab对信息进行分类显示. 本文实现采用FragmentTabHo ...
 - Win7搭建nginx+php+mysql开发环境以及websocket聊天实例测试
		
Win7搭建nginx+php+mysql开发环境以及websocket聊天实例测试一.下载相关安装包 1.下载nginx最新版本(nginx1.3.13版之后才支持websocket协议) 下载地址 ...
 - Vue 双层嵌套
		
这种的需要双层嵌套. 代码: <table id="ict-table" class="ict-table ict-report-table blue-theme& ...
 - 根据多年经验整理的《互联网MySQL开发规范》
		
一.基础规范 使用 INNODB 存储引擎 表字符集使用 UTF8 所有表都需要添加注释 单表数据量建议控制在 5000W 以内 不在数据库中存储图⽚.文件等大数据 禁止在线上做数据库压力测试 禁⽌ ...
 - 深入理解MySQL开发性能优化.pptx
		
深入理解MySQL开发性能优化.pptx,依旧上传baidu pan http://pan.baidu.com/s/1jIwGslS,视频暂未出,培训完成后会更新.
 - 【MySql】赶集网mysql开发36条军规
		
[MySql]赶集网mysql开发36条军规 2012-05-14 14:02:33 分类: Linux 写在前面的话: 总是在灾难发生后,才想起容灾的重要性: 总是在吃过亏后,才记得曾经有人提醒 ...
 
随机推荐
- C++11中的小细节--字符串的原始字面量
			
原始字面量很容易理解,即不进行转义的完整字符串. 最近看了看Python,其中讲到了原始字符串. Both string and bytes literals may optionally be pr ...
 - Kubernetes UI配置
			
#配置,在控制节点上操作#这里的镜像在谷歌上面需要FQ下载#######################################生成windows证书,将生成的证书IE.p12导入到IE个人证 ...
 - AlarmManager定时闹钟
			
一.AlarmManager介绍: AlarmManager是Android中常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的Intent.简单的说就是我们设定一个时间,然后在该时间到来 ...
 - hdu 5142(数学-进制转换)
			
NPY and FFT Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
 - (7)oracle数据类型
			
字符型 char 定长 最大2000字符 例如 char(20) 表示定长20 不够的补空格 定长查询速度快 varchar2 变长 最大4000字符 省空间 clob 字符型大对象 最大 ...
 - CF978B File Name【数组操作/序列判断连续出现>=3次的‘x’个数】
			
CF978B File Name [分析]:设置计数器cnt,计数x的个数:遇到非x,若cnt>=3的话累加多出的个数,计数器清零:若最后cnt>=3说明没遇到非x无法清零,那后部分就都是 ...
 - springmvc适配器的应用
			
前言 关于SpringMVC初始化ContextLoader中的XMLWebApplicationContext,以及DispatcherServlet初始化等等,这样的原理 已经有 ...
 - Filter过滤器笔记1
			
Filter:过滤器 Filter主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链.使用Filter的完整流程是:Filter对用户请求进行预处 ...
 - Android TextView 阴影效果(投影)
			
Android TextView 阴影效果(投影) 四个参数: 1 2 3 4 android:shadowColor="@color/white" android:shadowD ...
 - Android Developer -- Bluetooth篇 开发实例之二 连接设备
			
连接设备 In order to create a connection between your application on two devices, you must implement bot ...