试图将两个表从一个DB迁移到另一个DB

Pur*_*ome 6 sql sql-server migration

我正在尝试将一些数据从OLD数据库中的两个表迁移到新数据库.

问题是我希望在新数据库中为第一个导入的表生成新的主键.这很简单.

但旧数据库中的第二个表对第一个表具有外键依赖性.因此,当我想从第二个表迁移旧数据时,外键不再匹配.

是否有任何技巧/最佳实践来帮助我迁移数据?

严重注意:我无法更改新表的当前架构,这些表没有任何"旧ID"列.

让我们使用下表架构: -

Old Table1              New Table1
ParentId INT PK         ParentId INT PK
Name VARCHAR(50)        Name VARCHAR(50)

Old Table 2             New Table 2
ChildId INT PK          ChildId INT PK
ParentId INT FK         ParentId INT FK     
Foo VARCHAR(50)         Foo VARCHAR(50)
Run Code Online (Sandbox Code Playgroud)

所以表模式是相同的.

思考?

编辑:

对于那些要问的人,RDBMS是Sql Server 2008.我没有指定软件,因为我希望我能得到一些通用T-Sql的不可知答案:P

Bin*_*ier 4

我认为您需要分两步完成此操作。

您需要导入旧表并保留旧 ID(并生成新 ID)。然后,一旦它们位于新数据库中并且它们同时具有新旧 ID,您就可以使用旧 ID 来关联新 ID,然后删除旧 ID。

您可以通过导入到临时(即它们将被丢弃)表中,然后插入到永久表中来完成此操作,忽略旧的 id。

或者直接导入到新表中(修改架构以也保存旧 ID),然后在不再需要旧 ​​ID 时将其删除。

编辑:

好的,由于此处的评论和其他答案,我对您要寻找的内容更加清楚了。我敲了这个,我想它会做你想要的。

基本上没有游标,它会逐行遍历父表,并插入新的父行以及该父行的所有子行,从而保持新 ID 的同步。我尝试了一下,它应该可以工作,它不需要对表的独占访问,并且应该比游标快几个数量级。

declare @oldId as int
declare @newId as int

select @oldId = Min(ParentId) from OldTable1 

while not @oldId is null
begin
    Insert Into NewTable1 (Name)
    Select Name from OldTable1 where ParentId = @oldId

    Select @newId = SCOPE_IDENTITY()

    Insert Into NewTable2 (ParentId, Foo)
    Select @newId, Foo From OldTable2 Where ParentId = @oldId

    select @oldId = Min(ParentId) from OldTable1 where ParentId > @oldId

end
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助,