mysql有多张表如何快速复制表并把数据挪过去?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql有多张表如何快速复制表并把数据挪过去?相关的知识,希望对你有一定的参考价值。

比如说现在 A 数据库有100张表、我要用到的有30张 命令:show tables like "tbl_first%"
可以查询出我这30张表开头是以tbl_first起的,那么我现在想把这30张都复制一下,并把他们的表名修改成 tbl_second 这样的格式 ,最后这个A库里面的数据应该有130条,其中30条以前不动的表 开头是tbl_first, 又多增加了30张开头是 tbl_second ,这个不光是直接复制表过去,原来表里面的信息也要过去。 开始用create table 新表名 select * from 旧表名, 更改一张执行一次, 太慢了,有没有别的方法,听说用循环,但我不太理解到底是怎么使用,回答的最好用sql语句就按上面的这个举例 写个例子
php写吧

参考技术A 你指的是在A库中重建copy以tbl_first 开始的表,然后 在A库中黏贴并改名为tbl_second?
如果是这样,我这边提供个方法:命令如下
mysql -u root -paidengshan --database information_schema --execute=" select concat('create table tbl_second',substring(table_name,10),' as select * from ',table_name,';') from tables where table_name like 'tbl_first%' and table_schema ='A库的名字' " > d:\tt.txt
其中 数据库密码要改一下,table_schema改成A库的名字,如果执行正确的话,会在 d下生成一个tt.txt文件,内容就是生成的create table as select *。。的语句,不要复制第一行,下面几行都复制了,然后黏贴到mysql里面执行就可以了追问

要是按这样执行的话,应该有问题,我先问一下,1、 --database information_schema --execute 这句是特定写的吧,我不用修改? 2、 'create table tbl_second',substring(table_name,10),' as select * from ',table_name,';') from tables where table_name like 'tbl_first%' and table_schema ='A库的名字' " > d:\tt.txt 这段里的tbl_second新表后面还有具体的名字的,好比 tbl_second_user \tbl_second_product 等

追答

问题1:不用改
问题2:substring(table_name,10),这个 函数就是把tbl_first后面的字符取到,如 tbl_first_aaa然后会对应新建tbl_second_aaa,这样行不行

追问

对 我就是想要你最后一句话的内容、 其实我一直没有搞明白你后面写的那几个表名、直接用tables概括了,能否给个解释。 旧表开头的格式都是tbl_stat_ovi_*** 新表开头格式 tbl_stat_wp_***

追答

这个tables 也是个表名 他存放表信息,show create table也是查了这个表才得到信息的 ,information_schema 库相当于一个数据字典,表信息,权限,视图、索引都在里面,你有兴趣可以看看tables的结构。

我给你的mysql命令,我已经测试过了,可行,生成对应文件,然后你把tbl_first替换成tbl_stat_ovi_,tbl_second替换成tbl_stat_wp_即可执行了,

遇到问题继续追问

参考技术B 用create table A as select * from B 的类似语句编写就可以复制一个表的内容 参考技术C 我也向学学

MySQL 临时表复制表元数据

MySQL 临时表、复制表、元数据

MySQL 临时表

MySQL 临时表在我们需要保存一些临时数据时是非常有用的。
– 临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间
– TEMPORAR暂时

CREATE TEMPORARY TABLE SalesSummary (
     product_name VARCHAR(50) NOT NULL, 
		 total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00, 
		 avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00, 
		 total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);

– 查询表

select * from SalesSummary;

– 查看表结构

show COLUMNs FROM SalesSummary;

– 向临时表添加数据

 INSERT INTO SalesSummary(product_name, total_sales, avg_unit_price, total_units_sold) VALUES('cucumber', 100.25, 90, 2);
 INSERT INTO SalesSummary(product_name, total_sales, avg_unit_price, total_units_sold) VALUES('cucumber01', 90.25, 89, 2);

– 删除临时表

DROP TABLE SalesSummary;

– 当你使用 SHOW TABLES命令显示数据表列表时,你将无法看到 SalesSummary表
show tables
– 在MySQL命令控制台上也查询不到 select * from SalesSummary;

– 用查询直接创建临时表的方式: TEMPORARY(temporary暂时的)

CREATE TEMPORARY TABLE 临时表名 AS
(
    SELECT *  FROM 旧的表名
    LIMIT 0,10000
		
);

– 复制表

需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等。 如果仅仅使用CREATE TABLE … SELECT 命令,是无法实现的
– 使用 SHOW CREATE TABLE 命令获取创建数据表(CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等。
– 复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令 将完全的复制数据表结构。
– 如果你想复制表的内容,你就可以使用 INSERT INTO … SELECT 语句来实现。

CREATE  TABLE runoob_tbl  (
     product_name VARCHAR(50) NOT NULL, 
		 total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00, 
		 avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00, 
		 total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);
 INSERT INTO runoob_tbl (product_name, total_sales, avg_unit_price, total_units_sold) VALUES('cucumber', 100.25, 90, 2);
 INSERT INTO runoob_tbl (product_name, total_sales, avg_unit_price, total_units_sold) VALUES('cucumber01', 90.25, 89, 2);
select * FROM runoob_tbl;

SHOW CREATE TABLE runoob_tbl;
create table clone_tbl(
 product_name VARCHAR(50) NOT NULL, 
		 total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00, 
		 avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00, 
		 total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
)CHARSET=utf8;
INSERT INTO clone_tbl (product_name, total_sales, avg_unit_price, total_units_sold) VALUES('cucumber', 100.25, 90, 2);
 INSERT INTO clone_tbl (product_name, total_sales, avg_unit_price, total_units_sold) VALUES('cucumber01', 90.25, 89, 2);

– 查看表数据

 select * from clone_tbl;

– 拷贝数据表的数据你可以使用 INSERT INTO… SELECT 语句来实现

INSERT INTO (复制表的表名)table_name (cloumn_name) 
select cloumn_name 
from (被复制表的表名)table_name;
 INSERT INTO clone_tbl (product_name, total_sales, avg_unit_price, total_units_sold)
     SELECT product_name, total_sales, avg_unit_price, total_units_sold
     FROM runoob_tbl;

– 完整的复制表的内容,包括表结构及表数据
– 表结构 复制表和原表结构一样

show COLUMNS from clone_tbl;
show COLUMNS from runoob_tbl;
 

– 第一、只复制表结构到新表

create table 新表 select * from 旧表 where 1=2
– OR
– create table 新表 like 旧表

– 第二、复制表结构及数据到新表 – -- create table新表 select * from 旧表

– MySQL 元数据 – MySQL以下三种信息:
– -- 查询结果信息: SELECT, UPDATE 或 DELETE语句影响的记录数。
– 数据库和数据表的信息: 包含了数据库及数据表的结构信息。
– MySQL服务器信息: 包含了数据库服务器的当前状态,版本号等。

SELECT VERSION( ); 服务器版本信息
SELECT DATABASE( ); 当前数据库名 (或者返回空)
SELECT USER( ); 当前用户名
SHOW STATUS; 服务器状态
SHOW VARIABLES; 服务器配置变量

以上是关于mysql有多张表如何快速复制表并把数据挪过去?的主要内容,如果未能解决你的问题,请参考以下文章

统计多张表的数据总量

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

基于一张引用表JOIN多张表并统计记录

Windows环境下Mysql如何快速导入或恢复表为innodb的数据

如何将行从一个 Excel 工作表复制到另一个工作表并使用 VBA 创建重复项?

python读取excel表并把数据转存为字典