如何在不同数据库中的2个表/不同列之间移动数据

时间:2011-11-01 09:52:17

标签: mysql

我们有以下情况,其中foo已重命名为foo1

foo.col1已重命名为foo1.col11

foo.col2已被删除

实际上这些表曾经是类似的表,我想将这些表的数据从A复制到B.如果表/列名称已经发生变化,我将如何进行简单的迁移。

Database 'A'
create table foo {id pk, col1 varchar(255), col2 tinyint(1), col3 datetime);
create table foo_bar1 (id pk, foo_id fk, col4 datetime, col5 varchar(255));

Database 'B'
create table foo1 {id pk, col11 varchar(255), col3 datetime);
create table foo1_bar1 (id pk, foo1_id fk, col4 datetime, col5 varchar(255));

4 个答案:

答案 0 :(得分:10)

你应该能够做到:

INSERT INTO B.foo1 (id, col11, col3) 
 SELECT id,col1,col3 FROM A.foo;

INSERT INTO B.foo1_bar1 (id, foo1_id, col4, col5) 
 SELECT id,foo_id,col4,col5 FROM A.foo_bar1;

答案 1 :(得分:1)

BEGIN;
INSERT INTO B.foo1 (id, col11, col3) 
   SELECT id, col1, col3 
   FROM A.foo;
INSERT INTO B.foo1_bar1 (id, foo1_id, col4, col5) 
   SELECT id, foo_id, col4, col5 
   FROM A.foo_bar1;
COMMIT;

答案 2 :(得分:1)

如果您知道已删除的列,则可以直接插入查询结果:

INSERT INTO B.foo1 (id, col11, col3) (SELECT id, col1, col3 FROM A.foo);
INSERT INTO B.foo_bar1 (id, foo1_id, col4, col5) (SELECT id, foo_id, col4, col5 FROM A.foo_bar1);

答案 3 :(得分:1)

另一个解决方案,其中包括动态设置源数据库名称的第二个问题

创建脚本'bla.sql':

SET @q = CONCAT('INSERT INTO B.foo1 (id, col11, col3) 
  SELECT id,col1,col3 FROM ',@sourcedb,'.foo');
PREPARE stmt FROM @q;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

(根据需要添加其他声明)

然后从控制台运行:

mysql -e "SET @sourcedb:='A' ; source bla.sql;" B -u root

此解决方案的来源: variable database name 和koneraks评论; - )