2013-10-04 40 views
3

我确信有一种方法可以做到这一点,但我无法将这些部分放在一起。在MySql中将表和数据从一个模式复制到另一个模式的脚本

我想:

select table_name from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'myschema'; 

,然后....

for each table_name in that list 
BEGIN 
CREATE table myschemacopy.table_name like myschema.table_name; 
INSERT INTO myschemacopy.table_nameSELECT * FROM myschema.table_name; 
END LOOP 

如何才能做到这一点?

回答

2

只需复制下面的查询结果并运行它,或者您可以构建动态查询。

select 'select * into [newschema]. ' + table_name + ' from [myschema].' +table_name 
from INFORMATION_SCHEMA.TABLES 
where TABLE_SCHEMA = 'myschema' 
+0

这是不完全正确的,但它让我足够接近,以便我可以做我需要做的事情。如果任何人有未来更好的事情请让我知道。 – kasdega

+0

什么是正确的?你用过了吗?什么可以是动态查询? – JehandadK

12

如果是在同一台服务器只是一个不同的数据库,你可以使用

解决方案1:

CREATE TABLE newdb.mynewtable LIKE olddb.myoldtable; 

然后,您可以将数据从旧的使用

新表
INSERT newdb.mynewtable SELECT * FROM olddb.myoldtable; 

      [or] 

解决方案2

ALTER table olddb.myoldtable rename newdb.mynewtable 
1

这是有点晚了,但有刚刚解决了同样的问题,这里就是我想出的存储过程,在情况下,它可以帮助别人:

CREATE DEFINER=`whoever`@`wherever` PROCEDURE `copy_schema`(
    IN in_oldDB varchar(256), 
    IN in_newDB varchar(256), 
    IN in_copyData int(1) 
) 
BEGIN 

DECLARE v_finished INTEGER DEFAULT 0; 
DECLARE v_tname varchar(100) DEFAULT ""; 

DECLARE curTable CURSOR FOR 
SELECT `table_name` 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = in_oldDB 
and TABLE_TYPE='BASE TABLE' 
; 

DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1; 

set @result=NULL; 

# Create new schema if it doesn't exist 
SET @sql = CONCAT('CREATE SCHEMA IF NOT EXISTS ',in_newDB,';'); 
PREPARE create_schema FROM @sql; 
EXECUTE create_schema; 
DEALLOCATE PREPARE create_schema; 

# Loop over tables in old schema 
OPEN curTable; 
clone_tables: LOOP 

# get next table name 
FETCH curTable INTO v_tname; 

# Quit if we're done 
IF v_finished = 1 THEN LEAVE clone_tables; END IF; 

# Clone the table 
SET @sql = CONCAT("CREATE TABLE `", in_newDB, "`.`", v_tname, "` LIKE `", in_oldDB, "`.`", v_tname, "`;"); 
PREPARE clone_table FROM @sql; 
EXECUTE clone_table; 
DEALLOCATE PREPARE clone_table; 

# Optionally copy data 
#select v_tname; # This just gives some feedback in workbench for long-running copies 
IF (in_copyData > 0) THEN 
    SET @sql = CONCAT("INSERT INTO `", in_newDB, "`.`", v_tname, "` SELECT * FROM `", in_oldDB, "`.`", v_tname, "`;"); 
    PREPARE clone_data FROM @sql; 
    EXECUTE clone_data; 
    DEALLOCATE PREPARE clone_data; 
END IF; 

# Result message 
SET @result = IFNULL(CONCAT(@result,',',v_tname),v_tname); 

END LOOP clone_tables; 

# Close cursor 
CLOSE curTable; 

# Print result message 
SELECT CONCAT("Copied the following tables from ", in_oldDB, " to ", in_newDB, ": ", @result); 

END 
相关问题