如何将两个相同的数据库数据合并为一个?

时间:2013-02-23 15:11:59

标签: sql sql-server sql-server-2005 stored-procedures

两个客户将合并。他们都在使用我的应用程序和他们自己的数据库。大约几个星期他们正在合并(他们成为一个组织)。所以他们希望将所有数据都放在1​​个数据库中。

因此两个数据库结构完全相同。问题在于数据。例如,我有表位和人(这些只是两个表50):

数据库1:

Locations

Id    Name         Adress   etc....
1     Location 1
2     Location 2

Persons

Id    LocationId     Name     etc...
1     1              Alex
2     1              Peter
3     2              Lisa

数据库2:

Locations

Id    Name         Adress   etc....
1     Location A
2     Location B

Persons

Id    LocationId     Name     etc...
1     1              Mark
2     2              Ashley
3     1              Ben

我们看到该人与位置相关(列locationId)。请注意,我有更多表引用位置表和人员表。

数据库包含自己的位置和人员,但Id可以是相同的。如果我想将所有内容导入DB2,那么应该使用ID 3和4将DB1的位置插入到DB2中。来自DB1的人员应该有新的Id 4,5,6并且person表中的位置也是必须改为ids 4,5,6。

我解决这个问题的方法是编写一个处理所有内容的查询,但我不知道从哪里开始。

对于同时对孩子进行级联的Id字段重新编号的最佳方式(在查询中)是什么?数据库不包含参照完整性和外键(外键未在数据库中定义)。创建FKeys和Cascading不是一种选择。

我正在使用sql server 2005。

2 个答案:

答案 0 :(得分:2)

你说两个客户都在使用你的应用程序,所以我认为它是某种“收缩包装”软件,被更多的客户使用而不仅仅是这两个,对吗?

如果是,将特殊列添加到表或类似的任何内容可能会在将来引起痛苦,因为您要么必须为这两个可以处理其他列的客户维护特殊版本。或者你必须将这些列引入你的主代码库,这意味着你所有其他客户也会得到它们。

我可以想到一种更简单的方法,可以在不更改任何表格或添加任何列的情况下执行此操作 为了实现这一点,您需要找出两个数据库中存在的最大ID(无论在哪个表中或在哪个数据库中)

这可能需要一些副本和粘贴以获得大量看起来像这样的查询:

select max(id) as maxlocationid from locations
select max(id) as maxpersonid from persons
-- and so on... (one query for each table)

在两个数据库中运行查询后找到最大ID时,取一个大于该ID的数字,并将其添加到第二个数据库中所有表中的所有ID。 非常重要的是,该数字必须大于两个数据库中已存在的最大ID!
这有点难以解释,所以这是一个例子:

假设两个数据库中任何表中的最大ID为8000 然后运行一些SQL,将10000添加到第二个数据库中每个表中的每个ID:

update Locations set Id = Id + 10000
update Persons set Id = Id + 10000, LocationId = LocationId + 10000
-- and so on, for each table

查询相对简单,但这是最多的工作,因为你必须为数据库中的每个表手动构建一个这样的查询,并使用所有ID列的正确名称。

在第二个数据库上运行查询后,您问题中的示例数据将如下所示:

数据库1: (与以前完全一样)

Locations

Id    Name         Adress   etc....
1     Location 1
2     Location 2

Persons

Id    LocationId     Name     etc...
1     1              Alex
2     1              Peter
3     2              Lisa

数据库2:

Locations

Id    Name         Adress   etc....
10001 Location A
10002 Location B

Persons

Id    LocationId     Name     etc...
10001 10001          Mark
10002 10002          Ashley
10003 10001          Ben

就是这样!现在,您可以将数据从一个数据库导入另一个数据库,而不会发生任何主键冲突。

答案 1 :(得分:0)

如果这是我的问题,我可能会在我要保留的数据库中的表中添加一些列。这些将用于存储来自另一个db的pk值。然后我会插入其他表中的记录。对于具有外键的那些,我将使用已知值。然后我会根据需要更新并删除我添加的列。