我要求将两个相似的数据库合二为一 例如
我有两个不同的应用程序版本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
对此有任何帮助将不胜感激。
感谢。
答案 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)
此过程的难易程度完全取决于设置的架构的质量。让我们从最坏到最好开始:
这是最糟糕的情况,它违反了代理键的基本规则(在本例中为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,您无法检索旧值