两个数据库都具有相同的架构,但在某些表中可能会遇到与主键的冲突。所以我希望他们只是忽略重复的行,并继续进一步合并。
答案 0 :(得分:7)
首先,密钥冲突表明您当前使用的任何流程都很差。
要正确合并使用自动生成(non_GUID)键的两个数据库,您需要执行几个步骤。首先将新的自动生成的密钥添加到父表,然后从两个表中导入所有数据,将旧的文件重命名为ID_old,并将新文件重命名为旧的ID名称。此时,您可以移动子表。您需要通过连接到父表并将新的id字段作为外键的值而不是现有表中的值来复制到子表。您需要为每个外键表重复此过程,如果该表也是父表,则需要在复制任何数据之前将conversionid字段添加到表中,以便您可以在链中一直工作。要做到这一点,需要掌握大量关于数据库结构和大量规划的知识。如果没有两个源数据库的良好备份,请不要考虑这样做。如果两个数据库都处于单用户模式,则最好能够进行此过程。
如果您使用自然键并且有重复项,则会遇到很大的问题。所有重复的密钥记录都应首先移动到一个单独的表中,并确定应该制作哪个更正确的数据。在某些情况下,您会发现自然键实际上并不是唯一的(它们很少就是我几乎不使用它们的原因)并且合并的数据库需要使用某种类型的自动生成的键。这将涉及代码更改以及数据库更改,因此它是最后的选择。
您经常使用自然键找到的是每个数据的数据不同但是simliar(地址中的St. vice Street)在这种情况下标记插入记录之一,然后在两步中插入时,首先是没有重复的记录,然后是重复项表中标记为要插入的记录。请记住,您必须检查所有外键表中的所有记录,以确定要保留哪些记录以及哪些记录不保留。抛弃任何重复项是一个坏主意,你会丢失数据,可能是关键数据(如客户的订单)。这是一个漫长而乏味的过程,需要具有数据专业知识的人才能做出决定。作为程序员,您应该为他们提供一个重复数据删除工具,让他们检查每组重复项的所有数据,并选择要保留的内容和删除的内容,然后标记每个重复项,它将运行一个过程来插入记录。记住你的设计,对于真正的重复,会有一些子表(如订单)需要发送到数据库的记录选择作为输入的记录(订单是一个例子),对于其他表你会想要选择哪个是正确的(例如地址)。因此,您可以看到这是一个复杂的过程,需要彻底了解数据库。
如果您有很多重复项,他们可能会清理并添加数据数月,因此工具非常重要。这样做的人很可能是系统用户而不是数据库专家或程序员,因为他们是真正能够判断大部分内容的唯一人员。可能你需要在任何情况下做一些类似的事情,因为即使你有一个自动生成的密钥,也可能有重复的记录。它们更难找到。
没有简单的方法来合并两个数据库(即使使用GUIDS,您也会遇到自然键中重复的问题)。
答案 1 :(得分:6)
我知道这是一个老话题,但我必须评论我在很多帖子中看到的一般方法,并且尝试使用SQL查询本地执行所有操作。这些解决方案的共同点是在应用查询之前需要花费相当多的时间来创建和测试查询。
是的 - 您可以使用相对复杂的查询本地合并两个数据库,但您可以节省大量时间并免费使用第三方工具(大部分或全部都具有完全功能的免费试用版)。
市场上有很多这样的产品。其他帖子中已经提到的Red Gate是最好的之一,但您也可以尝试ApexSQL Data Diff,dbForge,SQL Comparison toolset和其他许多人。
答案 2 :(得分:4)
最好的选择可能是第三方应用程序,例如RedGate SQL Data Compare。花费一些钱,但是写IMO脚本是值得的。
答案 3 :(得分:1)
以下是近年来我两次如何做到这一点:http://byalexblog.net/merge-sql-databases
答案 4 :(得分:0)
如果你有主键,因为IDENTITY这是我的建议(不应该要求修改架构)。
ON UPDATE CASCADE
SET IDENTITY_INSERT
ON / OFF,从父表开始,然后转到子表答案 5 :(得分:0)
您只需向合并数据库中的所有表添加一个附加字段(例如,称为DatabaseID),并将其添加到主键。这样,您可以保留原始密钥,同时在合并数据库中具有唯一键 - 您可以告诉该行来自哪个数据库。这就是SQL-Hub的作用 - 如果它只是一次性工作,你可以通过免费试用做到这一点。