mysql开发之---使用游标双层嵌套对总表进行拆分为帖子表和回复表_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分钟

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











この記事では、MySQLのAlter Tableステートメントを使用して、列の追加/ドロップ、テーブル/列の名前の変更、列データ型の変更など、テーブルを変更することについて説明します。

記事では、証明書の生成と検証を含むMySQL用のSSL/TLS暗号化の構成について説明します。主な問題は、セルフ署名証明書のセキュリティへの影響を使用することです。[文字カウント:159]

記事では、MySQLで大規模なデータセットを処理するための戦略について説明します。これには、パーティション化、シャード、インデックス作成、クエリ最適化などがあります。

記事では、MySQLワークベンチやPHPMyAdminなどの人気のあるMySQL GUIツールについて説明し、初心者と上級ユーザーの機能と適合性を比較します。[159文字]

この記事では、ドロップテーブルステートメントを使用してMySQLのドロップテーブルについて説明し、予防策とリスクを強調しています。これは、バックアップなしでアクションが不可逆的であることを強調し、回復方法と潜在的な生産環境の危険を詳述しています。

記事では、外部キーを使用してデータベース内の関係を表すことで、ベストプラクティス、データの完全性、および避けるべき一般的な落とし穴に焦点を当てています。

この記事では、クエリパフォーマンスを強化するために、PostgreSQL、MySQL、MongoDBなどのさまざまなデータベースでJSON列にインデックスの作成について説明します。特定のJSONパスのインデックス作成の構文と利点を説明し、サポートされているデータベースシステムをリストします。

記事では、準備されたステートメント、入力検証、および強力なパスワードポリシーを使用して、SQLインジェクションおよびブルートフォース攻撃に対するMySQLの保護について説明します。(159文字)
