我被要求合并2个Access数据库。它们是同一文件的冲突版本。
数据库通过电子邮件发送给某人。 (我知道。)有人在'main'副本中添加了记录,而其他人则在其副本中添加了记录。我想在完全破坏所有其他副本之前,将“未经授权”副本中的新记录添加到主版本中。
不幸的是,数据库有几个相关的表。当添加记录时自然会发生这种情况,不同版本的记录具有冲突的主键。这些冲突的密钥也用作新记录中的外键。 ID x 的外键引用在两个版本中意味着不同。
有希望吗?我想到可能将它全部导入到excel中并使用公式来更新主键和外键。
有没有办法以编程方式解决这个问题?
答案 0 :(得分:2)
在主数据库中,将名为[oldID]的Long
字段添加到需要附加数据的每个表中。然后创建指向“其他”数据库中相关表的链接表。由于表名相同,链接表将附加一个“1”。
对于这个例子,我们有
[teachers]
ID teacher oldID
-- -------- -----
1 TeacherA
2 TeacherB
3 TeacherX
[teachers1]
ID teacher
-- --------
1 TeacherA
2 TeacherB
3 TeacherY
[tests]
ID test_name teacher oldID
-- -------------- ------- -----
1 TeacherA_Test1 1
2 TeacherA_Test2 1
3 TeacherB_Test1 2
4 TeacherX_Test1 3
[tests1]
ID test_name teacher
-- -------------- -------
1 TeacherA_Test1 1
2 TeacherA_Test2 1
3 TeacherB_Test1 2
4 TeacherY_Test1 3
5 TeacherY_Test2 3
记下表格分歧的位置。在这种情况下,[教师]表在ID = 2后发散。所以,将[teachers1]中的新行插入[teachers],将[teachers1]。[ID]放入[teachers]。[oldID],这样我们就可以将旧ID映射到新的:
INSERT INTO [teachers] ([teacher], [oldID])
SELECT [teacher], [ID] FROM [teachers1] WHERE [ID]>2
现在我们有了
[teachers]
ID teacher oldID
-- -------- -----
1 TeacherA
2 TeacherB
3 TeacherX
4 TeacherY 3
现在,当我们将[tests1]中的新行追加到[tests]中时,我们可以在[teachers]。[oldID]上使用INNER JOIN来调整插入的外键值:
INSERT INTO [tests] ([test_name], [teacher], [oldID])
SELECT [tests1].[test_name], [teachers].[ID], [tests1].[ID]
FROM [tests1] INNER JOIN [teachers] ON [tests1].[teacher]=[teachers].[oldID]
给我们
[tests]
ID test_name teacher oldID
-- -------------- ------- -----
1 TeacherA_Test1 1
2 TeacherA_Test2 1
3 TeacherB_Test1 2
4 TeacherX_Test1 3
5 TeacherY_Test1 4 4
6 TeacherY_Test2 4 5
注意[teacher]外键是如何从[tests1]中的值3
映射到[tests]中的4
的,反映了新的[教师]。[ID]值为' TeacherY”。
然后,您可以为[测试]的子表重复此过程。
(清理完成后,您可以删除表格链接并删除[oldID]列。)
答案 1 :(得分:0)
有没有办法以编程方式解决这个问题?
没有。这必须由能够阅读和理解数据并做出决定的人来完成。
使用表一和表2之间的内部联接创建查询,使用表一和表二之间的外部联接的另一个查询,以及在表二和表一之间使用外部联接的另一个查询。
现在,您可以研究差异并确定要保留的类似记录的版本以及哪些记录是全新的并且应该保留 - 有些记录是新的主键。