5

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

所以这两个数据库结构是相同的。问题出在数据上。例如,我有表位置和人员(这些只是两个 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 时,应将 DB1 的位置插入到 ID 为 3 和 4 的 DB2 中。来自 DB1 的人员应具有新的 ID 4、5、6 以及人员表中的位置必须更改为 ids 4,5,6。

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

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

我正在使用 sql server 2005。

4

2 回答 2

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

就是这样!现在,您可以将数据从一个数据库导入另一个数据库,而根本不会违反任何主键。

于 2013-02-23T17:37:27.273 回答
0

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

于 2013-02-23T15:18:47.210 回答