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

Ame*_*edo 5 sql sql-server stored-procedures sql-server-2005

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

所以这两个数据库结构是相同的。问题出在数据上。例如,我有表位置和人员(这些只是两个 50 的表):

数据库 1:

Locations

Id    Name         Adress   etc....
1     Location 1
2     Location 2
Run Code Online (Sandbox Code Playgroud)

Persons

Id    LocationId     Name     etc...
1     1              Alex
2     1              Peter
3     2              Lisa
Run Code Online (Sandbox Code Playgroud)

数据库2:

Locations

Id    Name         Adress   etc....
1     Location A
2     Location B
Run Code Online (Sandbox Code Playgroud)

Persons

Id    LocationId     Name     etc...
1     1              Mark
2     2              Ashley
3     1              Ben
Run Code Online (Sandbox Code Playgroud)

我们看到那个人与位置有关(列locationId)。请注意,我有更多的表是指位置表和人员表。

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

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

重新编号 Id 字段的最佳方法(在查询中)是什么,也有级联到孩子?数据库不包含参照完整性和外键(外键未在数据库中定义)。创建 FKey 和级联不是一种选择。

我正在使用 sql server 2005。

Chr*_*cht 2

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

如果是,向表中添加特殊列或类似的操作可能会在将来造成痛苦,因为您必须为这两个客户维护一个可以处理附加列的特殊版本。或者您必须将这些列引入您的主代码库,这意味着您的所有其他客户也将获得它们。

我可以想出一种更简单的方法来做到这一点,而无需更改任何表或添加任何列。
为了使其工作,您需要找出两个数据库中同时存在的最大ID(无论它在哪个表或哪个数据库中)

这可能需要一些复制和粘贴才能获得大量如下所示的查询:

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

在两个数据库中运行查询后找到最大的 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
Run Code Online (Sandbox Code Playgroud)

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

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

数据库1:( 和以前一样)

Locations:

Id    Name         Adress   etc....
1     Location 1
2     Location 2
Run Code Online (Sandbox Code Playgroud)

Persons:

Id    LocationId     Name     etc...
1     1              Alex
2     1              Peter
3     2              Lisa
Run Code Online (Sandbox Code Playgroud)

数据库2:

Locations:

Id    Name         Adress   etc....
10001 Location A
10002 Location B
Run Code Online (Sandbox Code Playgroud)

Persons:

Id    LocationId     Name     etc...
10001 10001          Mark
10002 10002          Ashley
10003 10001          Ben
Run Code Online (Sandbox Code Playgroud)

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