我们有以下情况,其中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));
答案 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评论; - )