假设您不需要消除重复,您可以为每个表执行此操作
insert into db1.tablea
select * from db2.tablea ;
一些并发症:
- 如果表有 id 列,则需要通过用新 id 替换旧 id 来确保它们不会发生冲突
- 但是,由于 id 是链接表的键,因此您需要确保每个表中的新 id 匹配。
这是一种快速而肮脏的方法:
- 在第一个数据库的 any 表中查找最高 id。
- 将此称为 max_key_db1。
- 然后将第二个数据库中的所有键更新为 current_value 加上 max_key_db1。
请注意,您需要同时更新主键和外键才能使其正常工作,例如:
update db2.tablea set id = id + max_key_db1, foreign_id = foreign_id + max_key_db1;
update db2.tableb set id = id + max_key_db1, a_id = a_id + max_key_db1;
etc.
现在您有了一个自洽的 db2,其中所有键(主键和外键)都具有 db1 中不存在的值;换句话说,您的键在两个数据库中是唯一的。
现在您可以将 db2 中的行插入到 db1 中:
insert into db1.tablea
select * from db2.tablea ;
请注意,如果插入的表使用自动增量或触发器创建自己的 id,则此将不起作用;在这种情况下,您必须明确指定 ciolumns 并关闭任何自动生成的 id:
insert into db1.tablea( id, foreign_id, col1, ...)
select id, foreign_id, col1 from db2.tablea ;
或者,您可以保持 db2 不变,只需对每个表执行此操作即可:
insert into db1.tablea( id, foreign_id, col3, col4)
select id + max_key_db1, foreign_id + max_key_db1, col3, col4 from db2.tablea ;
当然,这一切都在一个事务中完成,并且在你确定你已经得到每个表并且一切都正确之前不要提交。并在您的数据库的副本上执行此操作。
现在,由于您在 db1 中使用了最高键而不考虑表,因此您的 id 可能不会是连续的,但谁在乎呢?钥匙就是钥匙。您需要做的是为每个表重置任何 auto_increment 或序列,以便下一个自动生成的键高于该表中的最高键。如何做到这一点取决于您使用的 RDBMS。