两个客户将合并。他们都在使用我的应用程序和他们自己的数据库。大约几个星期他们正在合并(他们成为一个组织)。所以他们希望将所有数据都放在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。
答案 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值。然后我会插入其他表中的记录。对于具有外键的那些,我将使用已知值。然后我会根据需要更新并删除我添加的列。