mysql 从相同类型的多张表中提取到一张表中

蜗牛背着沉重的壳,贴着地面一步步艰难地向前爬行,不回头,也不左顾右盼,只是朝着自己想到达的地方行进。

有时候需要从多张相同类型的表中提取数据,这些表有一些相同的列或者表结构完全相同,同时表名存在一定的规律,如果表数量少还好,如果表数量多的话则会比较繁琐。可以通过存储过程将多张表的数据提取到一张表的方法来降低工作量。

先创建测试表并生成测试数据。
以下存储过程创建10张测试表,每张表生成10条测试数据。
drop PROCEDURE if EXISTS create10tables;
create PROCEDURE create10tables()
BEGIN
DECLARE t_name VARCHAR(32);
DECLARE i INT;
DECLARE j INT;
DECLARE continue HANDLER for not found set t_name = "";
set i = 0;
set j = 0;
create_loop:LOOP
set i = i + 1;
set t_name = CONCAT("ttest",i);
set @dropsql = CONCAT(‘drop table if EXISTS ‘,t_name);
#select @dropsql;
prepare dropsql from @dropsql;
EXECUTE dropsql;
DEALLOCATE prepare dropsql;
set @createsql = concat(‘create table ‘,t_name,‘ (id int(11) not null auto_increment,modifytime timestamp null default current_timestamp,vdata varchar(32) ,primary key(id));‘);
#select @createsql;
prepare createsql from @createsql;
EXECUTE createsql;
DEALLOCATE prepare createsql;
insert_loop:LOOP
set j = j+1;
if j > 10 THEN
LEAVE insert_loop;
end if;
set @insertsql = concat(‘insert into ‘,t_name,‘(vdata) values(md5(rand()));‘);
#select @insertsql;
PREPARE insertsql from @insertsql;
EXECUTE insertsql;
deallocate PREPARE insertsql;
end LOOP insert_loop;
set j = 0;
if i > 10 THEN
LEAVE create_loop;
end if;
end LOOP create_loop;
END;
#执行create10tables 生成表与数据
call create10tables();

有了表和数据,可以在information_schema数据库的innodb_tables表中看到新生成的对应的表名。这里可以通过该表将所有的表名查出来,然后进行数据提取。SQL如下:
drop PROCEDURE if exists selectalldata;
drop table if exists t_test;
create PROCEDURE selectalldata()
BEGIN
DECLARE done int DEFAULT FALSE;
DECLARE t_name VARCHAR(32);
declare i int;
DECLARE cur1 CURSOR for SELECT table_name from information_schema.TABLES where table_name like "ttest%";
DECLARE continue HANDLER for not found set done = TRUE;
open cur1;
set i = 0;
read_loop:LOOP
fetch cur1 into t_name;
if done THEN
LEAVE read_loop;
end if;
if i = 0 THEN
set @createsql = concat(‘create table t_test (id int(11) not null auto_increment,modifytime timestamp null default current_timestamp,vdata varchar(32) ,primary key(id));‘);
#select @createsql;
prepare createsql from @createsql;
EXECUTE createsql;
DEALLOCATE prepare createsql;
set i = i + 1;
end if;
set @insertsql = concat(‘insert into t_test(modifytime,vdata) select modifytime,vdata from ‘,t_name);
prepare insertsql from @insertsql;
EXECUTE insertsql;
DEALLOCATE prepare insertsql;
end LOOP;
close cur1;
END;
#执行selectdata
call selectalldata();
执行之后可以在t_test表中看到已经将所有的数据都提取出来了。

实际操作中,根据需要修改对应的SQL语句即可。

原文地址:http://blog.51cto.com/adwen2010/2142612

时间: 2024-11-09 00:05:30

mysql 从相同类型的多张表中提取到一张表中的相关文章

MySQL 常用字段类型,介绍及其建表使用方法经验分享

由于工作的公司没有专业的DBA又经常需要建立各种各种的表来满足自己的业务逻辑,所以经常查看MySQL 手册或者谷歌查看相关资料,所以本人就根据我的工作经验和相关资料来介绍一下MySQL各种字段类型及其使用.(由于本人还算是菜鸟哪里写的不对请多多指正,有兴趣的可以探讨一下) MySQL字段类型 int型包括(tinyint, smallint, mediumint, int, bigint) tinyint是1个字节表达范围就是2的8次方(-128-128) 或者(0-255) 很多人不明白为什么

Mysql之将一张表内容导入另一张表中

类别一. 如果两张张表(导出表和目标表)的字段一致,并且希望插入全部数据,可以用这种方法: INSERT INTO 目标表 SELECT  * FROM 来源表 ; 例如,要将A 表插入到B 表中,则可以通过如下SQL语句实现: INSERT INTO A SELECT * FROM B ; 类别二. 如果只希望导入指定字段,可以用这种方法: INSERT INTO 目标表 (字段1, 字段2, ...) SELECT 字段1, 字段2, ...FROM 来源表 ; 请注意以上两表的字段类型必须

mysql中的索引原理与表设计

索引是有效使用数据库的基础,但你的数据量很小的时候,或许通过扫描整表来存取数据的性能还能接受,但当数据量极大时,当访问量极大时,就一定需要通过索引的辅助才能有效地存取数据.一般索引建立的好坏是性能好坏的成功关键. 1.InnoDb数据与索引存储细节 使用InnoDb作为数据引擎的Mysql和有聚集索引的SqlServer的数据存储结构有点类似,虽然在物理层面,他们都存储在Page上,但在逻辑上面,我们可以把数据分为三块:数据区域,索引区域,主键区域,他们通过主键的值作为关联,配合工作.默认配置下

mysql优化和类型

MySQL还支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4)).int(M) 在 integer 数据类型中,M 表示最大显示宽度,该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度. 显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示. 在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系.和数字位数也无关系, int(3).int(4). int(8) 在磁盘上都是占用 4 btyes 的存储空间.

在mysql数据库中制作千万级测试表

在mysql数据库中制作千万级测试表 前言: 最近准备深入的学一下mysql,包括各种引擎的特性.性能优化.分表分库等.为了方便测试性能.分表等工作,就需要先建立一张比较大的数据表.我这里准备先建一张千万记录用户表. 步骤: 1 创建数据表(MYISAM方式存储插入速度比innodb方式快很多)   数据表描述 数据量:1千万 字段类型: id :编号 uname:用户名 ucreatetime: 创建时间 age:年龄 CREATE TABLE usertb(    id serial,   

mysql数据库索引类型和原理

索引初识: 最普通的情况,是为出现在where子句的字段建一个索引.为方便讲述,我们先建立一个如下的表. CREATE TABLE mytable ( id serial primary key, category_id int not null default 0, user_id int not null default 0, adddate int not null default 0 ); 很简单吧,不过对于要说明这个问题,已经足够了.如果你在查询时常用类似以下的语句: SELECT *

扩展mybatis和通用mapper,支持mysql的geometry类型字段

因项目中需要用到地理位置信息的存储.查询.计算等,经过研究决定使用mysql(5.7版本)数据库的geometry类型字段来保存地理位置坐标,使用虚拟列(Virtual Generated Column)来保存geohash值,便于查询. 需要了解geometry如何使用及优势可参看: mysql中geometry类型的简单使用 MySQL Geometry扩展在地理位置计算中的效率优势 本文主要讲解扩展mybatis和通用mapper,使其支持geometry类型字段的新增.修改.查询 首先创

mysql存取blob类型数据

参考网址:http://www.cnblogs.com/jway1101/p/5815658.html 首先是建表语句,需要实现将表建立好. CREATE TABLE `blobtest` ( `primary_id` varchar(32) NOT NULL, `bank_id` varchar(32) NOT NULL, `bank_name` varchar(64) NOT NULL, `blob_data` blob NOT NULL, PRIMARY KEY (`primary_id`

MySQL 中的临时表和内存表

内存表: 1.通过My.cnf中的max_heap_table_size指定,支持动态指定 2.表定义是存放在磁盘上的,扩展名为.frm,重启不会丢失,数据是存放在内存中的,所以重启会丢失数据 3.不支持BLOB或TEXT列 4.内存表初始化,可以使用--init-file来初始化,避免重启mysql后数据被清空.比如--init-file="/data/mysql/init.sql", init.sql格式为:          use db_test;          selec