如何在SQL Server中合并两个数据库?

11

这两个数据库拥有相同的模式(schema),但是在某些表中可能会出现主键冲突。因此,我希望它们能够忽略重复的行,并继续合并其他内容。

7个回答

10

首先,键冲突表明您目前使用的流程是不佳的。

要正确合并使用自动生成(非GUID)键的两个数据库,您需要采取几个步骤。首先向父表添加新的自动生成键,然后导入来自两个表的所有数据,将旧文件重命名为ID_old,将新文件重命名为旧ID名称。此时,您可以继续进行子表操作。您需要通过连接到父表并将新ID字段视为外键的值而不是现有表中的值来复制到子表。对于每个外键表,您需要重复此过程,并且如果该表也是父表,则需要在复制任何数据之前将conversionid字段添加到该表中,以便您可以一直工作到底层。要正确执行此操作,需要对数据库结构有很多知识和大量规划。不要在没有两个源数据库的备份的情况下考虑执行此操作。最好在两个数据库都处于单用户模式时进行此过程。

如果您使用自然键并且存在重复项,则会出现完全不同的问题。所有重复键记录都应首先移动到单独的表中,并确定哪个数据更正确。在某些情况下,您会发现自然键实际上不是唯一的(它们很少是这样,这就是我几乎从不使用它们的原因),并且合并的数据库将需要使用某种类型的自动生成键。这将涉及代码更改以及数据库更改,因此这是最后的选择。

你会经常发现自然键的数据不同但相似(例如地址中的 St. 和 Street)。在这种情况下,标记其中一个记录为插入记录,然后分两步进行插入:首先是没有重复项的记录,然后是标记为插入的重复记录。请记住,您将需要检查所有外键表中的所有记录,以确定哪些要保留,哪些不要保留。随意丢弃任何重复项是不明智的,因为这样可能会丢失数据,可能是关键数据(例如客户的订单)。这是一个漫长而繁琐的过程,需要专家对数据有深刻的理解才能做出决策。作为程序员,您应该为他们提供一个去重工具,让他们查看每组重复项的所有数据并选择要保留什么和要删除什么,然后标记一切,最后运行一个插入记录的过程。请记住,在设计时,对于真正的重复项,有一些子表(如订单)需要将来自两个表格的记录发送到已选择输入的记录的数据库中(订单是一个示例),对于其他表格,您需要选择正确的记录(例如地址)。因此,您可以看到,这是一个复杂的过程,需要对数据库有深入的了解。
如果您有很多重复项,清理和添加数据可能需要数月时间,因此工具确实非常重要。执行此操作的人员可能是系统用户而不是数据库专家或程序员,因为他们往往是唯一真正能够判断要保留哪个记录的人。在任何情况下,您可能需要进行类似的操作,因为即使您使用自动生成的键,也可能存在重复项。只是更难找到。
合并两个数据库没有简单的方法(即使使用 GUID,自然键中仍会有重复项的问题)。

8
我知道这是一个老话题,但我必须评论一下在许多帖子中看到的通用方法,即尝试使用SQL查询本地执行所有操作。这些解决方案共同点是需要花费相当大量的时间创建和测试查询,然后再应用它们。
所以,是的 - 你可以使用相对复杂的查询本地合并两个数据库,但你可以节省大量时间,并免费使用第三方工具(大多数或全部都有完全功能的免费试用版)。
市面上有很多这样的工具。Red Gate是最好的之一,但你也可以尝试ApexSQL Data DiffdbForgeSQL Comparison toolset等许多其他工具。

4
最好的选择可能是使用第三方应用程序,例如RedGate SQL Data Compare。虽然需要花费一些钱,但我认为它值得而且比编写脚本更好用。

2

1

如果您的主键是IDENTITY,这是我的建议(不应需要修改模式)。

  1. 设置所有外键,使其设置为ON UPDATE CASCADE
  2. 更新父表中的主键/IDENTITY字段,并添加要合并到相应表中的字段的最大值(FK将然后级联值到子表)
  3. 对于子表中的PK / IDENTITY字段也执行同样的操作
  4. 遵循this forum answer的建议,在插入每个表之前使用SET IDENTITY_INSERT ON / OFF,从父表开始,然后转移到子表

0
你可以在合并的数据库中的所有表格中添加一个额外的字段(例如称为DatabaseID),并将其添加到主键中。这样,您可以保留原始键,同时在合并的数据库中拥有唯一的键 - 并且您可以知道该行来自哪个数据库。这就是SQL-Hub所做的 - 如果只是一次性工作,您可以使用免费试用版完成此操作。

0

首先,确定所有表中的最高ID。假设它小于10,000,000。 在第二个数据库中,更新所有Pks和Fks并添加10,000,000。 例如,如果您当前的Id是500,则应变为100,000,500。Update MyTable set Id = Id + 10,000,00。 在更新所有Id之后,生成插入脚本并运行到第一个数据库。 最后,将每个表的标识种子设置为最大Id。

请注意,更新PK时会出现问题。您需要先删除它们,然后再更新。在SQL Server Management Studio中,您可以生成脚本并将“Script Primary Keys”设置为false。将生成的脚本运行到临时数据库中。修改生成的脚本以删除IDENTITY(1,1)..


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