从一个数据库导入到另一个数据库,且存在冲突的ID字段

3

我有一个基于Ruby on Rails的应用程序,有两个活动环境,StageProduction。我们的开发团队一直在使用Stage,但由于各种原因,我们想将数据移动到生产服务器上。然而,在新数据库中存在冲突的ID,所以不能简单地从一个位置提取数据并插入到另一个位置。例如,假设我们有一个名为Widgets的表:

Widget:
  id: 9836
  name: "Staging widget"
  parent_id: 9635
  container_id: 533

如果上述数据是我们的一个小部件,那么我们无法进行导入,因为已经存在一个带有ID 9836的小部件和/或已经存在一个带有ID 533的容器,这意味着我们需要爬取关联链来构建新的容器,然后再将小部件放入其中。
我们在两个环境中都使用MySQL数据库。我考虑过进行导入,只需将所有以_id结尾的适当列添加10,000,因为这将推动我们超出冲突边界,但这似乎是一个不好的解决方案。
是否有任何工具、项目或想法可以帮助我解决这个问题?
3个回答

1
过去,我曾通过一种笨拙的方式解决了这个问题,即将我要导入的所有数据的ID都变成负数。当然,这只适用于您的ID列是有符号的,并且最多只有两个数据源的情况。

MySQL支持使用负ID来表示事物吗? - Mike Trpcic
@Mike:是的,可以。你的PK int可以是有符号或无符号的。 - D'Arcy Rittich
看起来我们的是未签名的,这应该是创建表时Rails的默认设置,简单的测试证实了这一点。我会看看这个解决方案是否适用于我。 - Mike Trpcic
不幸的是,我们的ORM ActiveRecord在保存实体时会将负整数转换为正整数,这意味着这种解决方案对我们来说行不通。不过这确实是一个好主意。 - Mike Trpcic
@Mike:哇,它可以透明地执行这个操作吗?那就太不对了。 - D'Arcy Rittich
是的,我正在寻找一种关闭它的方法。 - Mike Trpcic

1

如果您无法使用负ID,请将一个数字添加到所有导入的ID中。该数字必须大于目标数据库的最大ID。


当MySQL序列生成器追上这些ID时,这会引起问题吗? - Mike Trpcic
不会造成任何问题。由自增序列生成的下一个值将是最大ID +1,无论该ID是显式插入还是由自增生成。 - aeon
这是MySQL手册中关于自增行为的片段,链接如下:http://dev.mysql.com/doc/refman/5.1/en/example-auto-increment.html - aeon

0

好的,你应该做的事情(我假设这是基于MySQL标签的)就是运行以下SQL语句(我不是RoRails专业人员,但是是一名带有MySQL的PHP开发人员,如果不适用,我很抱歉):

这篇文章ID为一个基本想法

另一个选择是使用像phpMyAdmin这样的程序(是用PHP编写的),它是一种数据库GUI工具。通过phpMyAdmin,你可以导出表中选择的字段。只需导出除ID字段之外的所有数据,然后你可以运行该数据的导入。

这部分我有点模糊。我想你有一个实际的包含Widget内容的文件。如果是这样,请创建一个脚本,遍历每一行数据并生成Widget文件。


这样做行不通,因为导入所有小部件不会自动更新它们与父级和容器的关联ID(外键)。这才是真正的问题。另外,我没有一个实际包含小部件数据的文件,那只是基于YAML构建的数据库行。 - Mike Trpcic
你能创建一个YAML文件吗?因为如果你从数据库中获取数据,你可以重新创建YAML文件。也许像这样:http://snippets.dzone.com/posts/show/2525 - Addo Solutions

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接