将两个相似的数据库合并到一个DB中

时间:2011-11-11 04:52:05

标签: sql database migration

我要求将两个相似的数据库合二为一 例如

我有两个不同的应用程序版本1.0数据库看起来像这样

company 1 table

    id Name Address  state
    1  aaa  street2  CA
    2  bbb  street2  CA   


company 2 table

    id Name Address  state
    1  ccc  street2  CA
    2  ddd  street2  CA   

现在我想将两个不同的数据库合并到一个i app版本2中 app version 2表看起来像这样

id company_id name Address state
1   c1        aaa  street2  CA
2   c1        bbb  street2  CA      
3   c2        ccc  street2  CA
4   c2        ddd  street2  CA     
两个版本中的

id列是带有自动增量的标识列

这里的问题是,如果我将数据移动到版本2表,如果发生了如何修改引用此id的子表数据,我的id将会改变。

有没有任何工具可以随时处理这个问题,或者我们需要编写自己的脚本来实现这一点我有大量这样的表从版本1迁移到版本2

对此有任何帮助将不胜感激。

感谢。

3 个答案:

答案 0 :(得分:0)

由于两个表中的ID都是身份,因此您将安全地拥有来自两家公司的客户具有相同的ID:我建议您为App2创建一个新ID,这也可以是身份,并存储用户的旧ID以便保持与其他表的关系。例如,你neew table必须如下:

NEW ID  old_id company_id name Address state
100     1       c1        aaa  street2  CA
101     2       c1        bbb  street2  CA      
102     1       c2        ccc  street2  CA
103     2       c2        ddd  street2  CA  

我不知道是否是一个自动完成它的工具。

答案 1 :(得分:0)

此过程的难易程度完全取决于设置的架构的质量。让我们从最坏到最好开始:

用户使用Identity列。

这是最糟糕的情况,它违反了代理键的基本规则(在本例中为Id列):它们应该对用户隐藏。如果允许用户查看,使用,打印输出,在物理项目上标记身份值,那么您的任务就更加困难。唯一合理的解决方案是添加一个指示系统源的列,并修改标识列上的唯一或主键约束以包含此新列。这样,您的数据将如下所示:

id   company_id  name       address     state
1    c1          aaa        street2     CA              
2    c1          bbb        street2     CA
1    c2          ccc        street2     CA              
2    c2          ddd        street2     CA

使这个解决方案如此糟糕的原因是您不能再使用Identity属性,所有业务层和接口代码必须更改以在将值保存到此表时将company_id作为参数传递,并且必须审查任何报告确定它们是否会破裂或它们将如何破裂。此外,所有外键关系都必须与写入这些表的所有代码一起更改。这是一个正确的混乱。

标识列未被用户使用但没有业务密钥。

我正在调用它的“业务键”是对表中一组列的唯一约束,而不是作为代理键的Identity列。这违反了关于代理键的基本规则,数据合并是一个真正让它变得丑陋的领域。最简单的解决方案是临时向包含先前系统PK的表添加一列,并使用该列导入相关表。

Alter Table CompanyName
    Add Column LegacyPk int null 
GO
Insert NewTable( company_id, name, address, state, LegacyPk )
Select company_id, name, address, state, id
From company_2.Table

Insert SomeChildTable(....
Select ...
From NewTable
    Join OldChildTable
        On OldChildTable.ParentId = NewTable.LegacyPk

用户不使用标识列,并且存在业务键。

这是最好的情况。在这种情况下,代理键应该按原样使用,您可以使用业务键进行连接:

Insert NewTable( company_id, name, address, state )
Select company_id, name, address, state
From company_2.Table As C2
    Left Join company_3.Table As C1
        On C1.KeyCol = C2.KeyCol
Where C1.KeyCol Is Null

答案 2 :(得分:0)

在两个表中的密钥标识中,您必须使用旧ID。因为您需要保护所有数据而不使用旧ID,您无法检索旧值