MySQL存储过程举例
涉及循环、动态sql等主要的MySQL存储过程知识。
需求:
遍历所有【test_ondev_[0-9]】开头的表,将其中的所有数据按表中的col字段存储到【test_ondev_history_ + col的值】的表里面,当【test_ondev_history_ + col】不存在的时候复制test_ondev_history的结构创建该表,并将数据存储进表里。
程序思路:
- 遍历表名
- 将每张表的col字段的内容统计出来
- 创建 test_ondev_history_ + col 的表
- 将数据插入进去test_ondev_history_ + col表中
- 继续遍历其他表
使用存储过程实现:
DELIMITER $$ CREATE PROCEDURE `p_copy_data`()
BEGIN DECLARE i INT; DECLARE v_sql_col VARCHAR(200);
DECLARE j INT;
DECLARE max_id_s INT;
DECLARE max_id INT;
DECLARE v_tbname VARCHAR(50);
DECLARE v_tbname_s VARCHAR(50);
DECLARE v_col VARCHAR(50);
DECLARE v_sql_create VARCHAR(200);
DECLARE v_sql_insert VARCHAR(200); CREATE TABLE IF NOT EXISTS temp_col(id INT PRIMARY KEY AUTO_INCREMENT,col VARCHAR(50));
CREATE TABLE IF NOT EXISTS tbnames(id INT PRIMARY KEY AUTO_INCREMENT,tbname VARCHAR(50));
TRUNCATE TABLE tbnames;
INSERT INTO tbnames(tbname)
SELECT table_name FROM information_schema.`TABLES` WHERE table_name REGEXP 'test_ondev_[0-9]';
SET i = (SELECT MIN(id) FROM tbnames);
SET max_id_s = (SELECT MAX(id) FROM tbnames); WHILE i <=max_id_s
DO
TRUNCATE TABLE temp_col;
SET v_tbname_s = (SELECT tbname FROM tbnames WHERE id = i);
SET v_sql_col = CONCAT('insert into temp_col(col) select distinct col from ',v_tbname_s);
SET @v_sql_col := v_sql_col;
PREPARE stmt FROM @v_sql_col;
EXECUTE stmt ;
DEALLOCATE PREPARE stmt; SET j =1;
SET max_id = (SELECT MAX(id) FROM temp_col );
WHILE j <= max_id
DO
SET v_col = (SELECT col FROM temp_col WHERE id =j);
SET v_tbname = CONCAT('test_ondev_history_',v_col );
SET v_sql_create = CONCAT('create table if not exists ',v_tbname,' like test_ondev_history;');
SET @v_sql_create := v_sql_create;
PREPARE stmt FROM @v_sql_create;
EXECUTE stmt ;
DEALLOCATE PREPARE stmt;
SET v_sql_insert = CONCAT('insert into ',v_tbname,' select * from ',v_tbname_s," where col='", v_col ,"';"); SET @v_sql_insert := v_sql_insert;
PREPARE stmt FROM @v_sql_insert;
EXECUTE stmt ;
DEALLOCATE PREPARE stmt; SET j = j + 1;
END WHILE; SET i = i + 1;
END WHILE; END$$
TIPS:
MySQL不建议使用存储过程,如果临时用的话可以考虑临时使用。
另外,该过程是第一版实现历史数据的迁移,如果需要重复执行还有不少优化空间,例如:
- 遍历表的时候需要指定对应库;
- 上述过程不能重复执行,如果重复执行,需要怎么改进;
- 中途涉及创建表,如果不创建哪些临时表改如何调整;
这些就留给大家思考了,也欢迎来和我沟通。文章如果有误,欢迎斧正 ,非常感谢。
MySQL存储过程举例的更多相关文章
- MariaDB MariaDB、MySQL存储过程、游标基础应用举例说明
MariaDB.MySQL存储过程.游标基础应用举例说明 by:授客 QQ:1033553122 测试环境: MariaDB-10.0.19-centos7-x86_64 实践操作: # 创建测试数据 ...
- Mysql存储过程和函数
Mysql存储过程和函数 基本概念: 创建存储过程和函数是指将经常使用的一组SQL语句的组合在一起,并将这些SQL语句当作一个整体存储在MySQL服务器中.例如,银行经常需要计算用户的利息.不同类别的 ...
- 第二百八十三节,MySQL数据库-MySQL存储过程
MySQL数据库-MySQL存储过程 MySQL存储过程,也就是有点像MySQL函数,但是他与MySQL函数是有区别的,后面会讲到函数,所以注意区分 注意:函数与存储过程的区别 存储过程是:CREAT ...
- Mysql存储过程、索引
sql语句执行顺序: from--->where--->group by--->having--->计算所有的表达式--->order by--->select 输 ...
- MySQL存储过程入门教程
存储过程介绍 存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程可由应用程序通过一个调用来执行,而且 ...
- 面试官突然问我MySQL存储过程,我竟然连基础都不会!(详细)
所有知识体系文章,GitHub已收录,欢迎Star!再次感谢,愿你早日进入大厂! GitHub地址: https://github.com/Ziphtracks/JavaLearningmanual ...
- MySQL存储过程(转)
一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b" ...
- MySql存储过程
MySQL 存储过程 ```sql CREATE PROCEDURE myprocedure (IN para01 INTEGER) BEGIN DECLARE var01 CHAR(10); IF ...
- mysql存储过程和存储函数
mysql存储过程和存储函数 存数函数代码示例: DROP PROCEDURE IF EXISTS calc_ci_day_suc_rate; delimiter // CREATE FUNCTION ...
随机推荐
- softmax回归推导
向量\(y\)(为one-hot编码,只有一个值为1,其他的值为0)真实类别标签(维度为\(m\),表示有\(m\)类别): \[y=\begin{bmatrix}y_1\\ y_2\\ ...\\y ...
- 动态规划_01背包_从Dijikstra和Floyd入手,彻底理解01背包
dp一直是短板,现在从最基础的地方开始补 给定背包总容量 M ,n个商品选择,分别有价值vi,占量wi,从中取商品放入背包,令.容量和W=Σwi不超过M,令背包中的价值和V=Σvi最大 然后取法有很多 ...
- java nio消息半包、粘包解决方案
问题背景 NIO是面向缓冲区进行通信的,不是面向流的.我们都知道,既然是缓冲区,那它一定存在一个固定大小.这样一来通常会遇到两个问题: 消息粘包:当缓冲区足够大,由于网络不稳定种种原因,可能会有多条消 ...
- stand up meeting 12/4/2015 -12/6/2015
part 组员 今日工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云 ------ --- 数据库 朱玉影 等待张葳出关 0 foxit reader 6 ...
- python嵌套列表知多少
今天在创建嵌套列表时遇到一个问题,决定看看到底是谁在背后捣鬼 >>> board1 = [[0]*3 for _ in range(3)] [[0, 0, 0], [0, 0, 0] ...
- [bilibili服]明日方舟游戏时长限制破解
bilibili服 明日方舟 游戏时长如何破解 众所周知,明日方舟游戏对未成年人实行了游戏时长限制,小编也感到十分惊讶--咳咳--言归正传--之前在网上看到过有说可以通过进入战斗之后断网来实现延长时间 ...
- javascript实例教程使用canvas技术模仿echarts柱状图
canvas 画布是HTML5中新增的标签,可以通过js操作 canvas 绘图 API在网页中绘制图像. 百度开发了一个开源的可视化图表库ECharts,功能非常强大,可以实现折线图.柱状图.散点图 ...
- Spring Cloud+nacos+Feign,实现注册中心及配置中心
写在前面 注册中心.配置中心的概念就不在这里解释了.发现服务原来一直用的是Eureka,因为这家伙闭源了,不爽.然后就发现了nacos,阿里巴巴的,好东西,一个搞定注册中心和配置中心.官网:https ...
- 快速从零开始安装Laravel5.2教程
前面 本文默认你Win电脑什么都没装,也就是从零开始安装Laravel,并且环境都由我来指定分配哈! 环境 首先搭建运行环境,先到 PhpStudy官网 下载PhpStudy的Windows版本.然后 ...
- git工具上传项目到码云
首先,你需要在本地安装git客户端,此处简单易懂,略过然后,在本地建好文件夹,以本人为例,我的路径为 E:\git_project,此时需要通过鼠标右键选择:git bush here 如图所示然后会 ...