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

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

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

数据库1:

位置:

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

人数:

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

数据库2:

位置:

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

人数:

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.

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

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

我可以想到一种更简单的方法来做到这一点,而无需更改任何表或添加任何列.
为了使其工作,您需要找出两个数据库中存在的最大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,为第二个数据库中的每个表中的每个ID添加10000:

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

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

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

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

位置:

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

人数:

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

数据库2:

位置:

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

人数:

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

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

点赞