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。
您说两个客户都在使用您的应用程序,所以我认为这是某种“收缩包装”软件,使用的客户不仅仅是这两个客户,对吗?
如果是,向表中添加特殊列或类似的操作可能会在将来造成痛苦,因为您必须为这两个客户维护一个可以处理附加列的特殊版本。或者您必须将这些列引入您的主代码库,这意味着您的所有其他客户也将获得它们。
我可以想出一种更简单的方法来做到这一点,而无需更改任何表或添加任何列。
为了使其工作,您需要找出两个数据库中同时存在的最大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)
就是这样!现在,您可以将数据从一个数据库导入到另一个数据库,而不会出现任何主键冲突。
归档时间: |
|
查看次数: |
4123 次 |
最近记录: |