这两个数据库拥有相同的模式(schema),但是在某些表中可能会出现主键冲突。因此,我希望它们能够忽略重复的行,并继续合并其他内容。
这两个数据库拥有相同的模式(schema),但是在某些表中可能会出现主键冲突。因此,我希望它们能够忽略重复的行,并继续合并其他内容。
首先,键冲突表明您目前使用的流程是不佳的。
要正确合并使用自动生成(非GUID)键的两个数据库,您需要采取几个步骤。首先向父表添加新的自动生成键,然后导入来自两个表的所有数据,将旧文件重命名为ID_old,将新文件重命名为旧ID名称。此时,您可以继续进行子表操作。您需要通过连接到父表并将新ID字段视为外键的值而不是现有表中的值来复制到子表。对于每个外键表,您需要重复此过程,并且如果该表也是父表,则需要在复制任何数据之前将conversionid字段添加到该表中,以便您可以一直工作到底层。要正确执行此操作,需要对数据库结构有很多知识和大量规划。不要在没有两个源数据库的备份的情况下考虑执行此操作。最好在两个数据库都处于单用户模式时进行此过程。
如果您使用自然键并且存在重复项,则会出现完全不同的问题。所有重复键记录都应首先移动到单独的表中,并确定哪个数据更正确。在某些情况下,您会发现自然键实际上不是唯一的(它们很少是这样,这就是我几乎从不使用它们的原因),并且合并的数据库将需要使用某种类型的自动生成键。这将涉及代码更改以及数据库更改,因此这是最后的选择。
你会经常发现自然键的数据不同但相似(例如地址中的 St. 和 Street)。在这种情况下,标记其中一个记录为插入记录,然后分两步进行插入:首先是没有重复项的记录,然后是标记为插入的重复记录。请记住,您将需要检查所有外键表中的所有记录,以确定哪些要保留,哪些不要保留。随意丢弃任何重复项是不明智的,因为这样可能会丢失数据,可能是关键数据(例如客户的订单)。这是一个漫长而繁琐的过程,需要专家对数据有深刻的理解才能做出决策。作为程序员,您应该为他们提供一个去重工具,让他们查看每组重复项的所有数据并选择要保留什么和要删除什么,然后标记一切,最后运行一个插入记录的过程。请记住,在设计时,对于真正的重复项,有一些子表(如订单)需要将来自两个表格的记录发送到已选择输入的记录的数据库中(订单是一个示例),对于其他表格,您需要选择正确的记录(例如地址)。因此,您可以看到,这是一个复杂的过程,需要对数据库有深入的了解。如果您的主键是IDENTITY,这是我的建议(不应需要修改模式)。
ON UPDATE CASCADE
SET IDENTITY_INSERT
ON / OFF,从父表开始,然后转移到子表首先,确定所有表中的最高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)..