答案 0 :(得分:2)
没有自动的方法来执行此操作,因为无法以通用方式自动执行此操作(无需执行某些您想要执行的操作)。因此,它需要几个步骤,但您可以一直使用工具。
您可以使用Heroku的内置工具来获取表的转储。首先将数据下载并导入数据库,然后将其转储为文本文件(SQL格式)。
在SQL中将其中一个数据集作为文本后,您需要稍微编辑该文件。您需要将其设置为导入脚本,而不是通过删除现有行(或表)开始的“重建数据库”脚本。如果你小心,它可能已经是正确的格式,但可能会有一些关闭。
你可以遇到一些陷阱:
一旦文本文件处于良好状态,请在本地运行并测试它。如果它搞砸了,请不要担心 - 只需下载生产数据(您要导入的数据),然后再试一次。迭代,直到你在当地运作良好。然后,将文件上传到heroku。
我知道这听起来像是几步 - 而且确实如此。但是,没有棘手的问题需要解决。你只需要慢慢地小心行事。让某人与你配对,以帮助你思考。
答案 1 :(得分:2)
假设您不需要消除重复项,您可以为每个表
执行此操作insert into db1.tablea
select * from db2.tablea ;
一些并发症:
这是一种快速而肮脏的方法:
请注意,您需要更新主键和外键才能使其正常工作,例如:
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或sequence,以便下一个自动生成的密钥高于该表中的最高密钥。你如何做到这一点取决于你正在使用的RDBMS。
答案 2 :(得分:0)
要关闭它 - 决定只是手动选择正确的数据并重新输入它,这样我就可以做一些错误检查 - 这很痛苦,但这种方法似乎没有一个简单的答案。自我注意:将所有生产数据保留在生产与测试驱动中。
答案 3 :(得分:0)
如果您只需要执行一次,则可以使用ms访问轻松完成此操作。
您可以通过在可视化查询设计器中创建一些查询来解决任何冲突。
您可以使用odbc driver for sqllite3连接到sqlite3数据库,并在访问中链接这些表。