mysql 從相同類型的多張表中提取到一張表中
有時候需要從多張相同類型的表中提取數據,這些表有一些相同的列或者表結構完全相同,同時表名存在一定的規律,如果表數量少還好,如果表數量多的話則會比較繁瑣。可以通過存儲過程將多張表的數據提取到一張表的方法來降低工作量。
先創建測試表並生成測試數據。
以下存儲過程創建10張測試表,每張表生成10條測試數據。
drop PROCEDURE if EXISTS create10tables;
create PROCEDURE create10tables()
BEGIN
DECLARE t_name VARCHAR(32);
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;
#select @createsql;
prepare createsql from @createsql;
EXECUTE createsql;
DEALLOCATE prepare createsql;
insert_loop:LOOP
set j = j+1;
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語句即可。
mysql 從相同類型的多張表中提取到一張表中