注意点:

(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开发之---使用游标双层嵌套对总表进行拆分为帖子表和回复表的更多相关文章

  1. 第一篇:Win10系统搭建Python+Django+Nginx+MySQL 开发环境详解(完美版)

    Win10+Python+Django+Nginx+MySQL 开发环境搭建详解 PaulTsao 说明:本文由作者原创,仅供内部参考学习与交流,转载引用请注明出处,用于商业目的请联系作者本人. Wi ...

  2. MySQL开发指南

    数据库开发是数据库管理系统(DBMS)和数据库应用软件设计研发的总称,数据运维.参与数据库生产环境的问题优化和解决等方面的事宜. 1.关于MySQL数据库 2.搭建MySQL环境 3.入门常用SQL. ...

  3. MySQL(8)---游标

    Mysql(8)-游标 上一遍博客写了有关存储过程的语法知识 Mysql(7)---存储过程 游标或许你在工作中很少用到,但用不到不代表不去了解它,但你真正需要它来解决问题的时候,再花时间去学习很可能 ...

  4. 使用FragmentTabHost+TabLayout+ViewPager实现双层嵌套Tab

    大多数应用程序都会在底部使用3~5个Tab对应用程序的主要功能进行划分,对于一些信息量非常大的应用程序,还需要在每个Tab下继续划分子Tab对信息进行分类显示. 本文实现采用FragmentTabHo ...

  5. Win7搭建nginx+php+mysql开发环境以及websocket聊天实例测试

    Win7搭建nginx+php+mysql开发环境以及websocket聊天实例测试一.下载相关安装包 1.下载nginx最新版本(nginx1.3.13版之后才支持websocket协议) 下载地址 ...

  6. Vue 双层嵌套

    这种的需要双层嵌套. 代码: <table id="ict-table" class="ict-table ict-report-table blue-theme& ...

  7. 根据多年经验整理的《互联网MySQL开发规范》

    一.基础规范 使用 INNODB 存储引擎 表字符集使用 UTF8  所有表都需要添加注释 单表数据量建议控制在 5000W 以内 不在数据库中存储图⽚.文件等大数据 禁止在线上做数据库压力测试 禁⽌ ...

  8. 深入理解MySQL开发性能优化.pptx

    深入理解MySQL开发性能优化.pptx,依旧上传baidu pan http://pan.baidu.com/s/1jIwGslS,视频暂未出,培训完成后会更新.

  9. 【MySql】赶集网mysql开发36条军规

    [MySql]赶集网mysql开发36条军规 2012-05-14 14:02:33 分类: Linux   写在前面的话: 总是在灾难发生后,才想起容灾的重要性: 总是在吃过亏后,才记得曾经有人提醒 ...

随机推荐

  1. OI 知识体系

    OI Training 知识体系结构 初级 1.1 C语言基础 1.1.1 C语言程序结构(A+B Problem) 1.1.2 变量,常量,数据类型,输入与输出 1.1.3 条件语句 1.1.4 循 ...

  2. centos dhcp获取不到ip解决方法 Bringing up interface eth0: Device eth0 does not seem to be present,delaying initialization.

    1.删除文件: /etc/udev/rules.d/70-persistent-net.rules 2.编辑 /etc/sysconfig/network-scripts/ifcfg-eth0 删除H ...

  3. VS2013 更改MFC标题栏图标和生成的执行文件图标

    创建一个新工程,可以什么都不加.打开.rc,  创建或打开Icon资源(以下都以Icon为例).     单击工程窗口的资源视图标签,选中资源ID为IDR_MAINFRAME图标资源,然后按Delet ...

  4. linux 内核库函数 【转】

    转自:http://blog.chinaunix.net/uid-20321537-id-1966892.html 当编写驱动程序时,一般情况下不能使用C标准库的函数.Linux内核也提供了与标准库函 ...

  5. python搭建区块链

    #!/usr/bin/env python # encoding: utf-8 ''' 我们要创建一个 Blockchain 类 ,他的构造函数创建了一个初始化的空列表(要存储我们的区块链),并且另一 ...

  6. 【C语言】指针增减

    int *pa = NULL; ; printf("%x\n", pb); char *pca = NULL; ; printf("%x\n", pcb); s ...

  7. qt include无法自动补齐

    原因一: 检查cmake有没有include_directories 原因二: CmakeList.txt放错位置 原因三: 没有用qt new file来创建头文件

  8. 计蒜客 18487.Divisions-大数的所有因子个数-Miller_Rabin+Pollard_rho-超快的(大数质因解+因子个数求解公式) (German Collegiate Programming Contest 2015 ACM-ICPC Asia Training League 暑假第一阶段第三场 F)

    这一场两个和大数有关的题目,都用到了米勒拉宾算法,有点东西,备忘一下. 题目传送门 F. Divisions 传送门 这个题是求一个数的所有因子个数,但是数据比较大,1e18,所以是大数的题目,正常的 ...

  9. 洛谷—— P1022 计算器的改良

    P1022 计算器的改良 题目背景 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了 ...

  10. [CTSC2018]假面(概率DP)

    考场上以为CTSC的概率期望题都不可做,连暴力都没写直接爆零. 结果出来发现全场70以上,大部分AC,少于70的好像极少,感觉血亏. 设a[i][j]表示到当前为止第i个人的血量为j的概率(注意特判血 ...