我正在尝试将一些数据从旧数据库中的两个表迁移到新数据库中。
问题是我希望在新数据库中为要导入的第一个表生成新的主键。很简单
但是旧数据库中的第二个表对第一个表具有外键依赖性。因此,当我想从第二张表中迁移旧数据时,外键不再匹配。
是否有任何技巧/最佳实践可以帮助我迁移数据?
请注意:我无法更改没有任何“旧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)
因此,表架构是相同的。
有什么想法吗?
编辑:
对于那些询问的人,RDBMS是Sql Server2008。我没有指定软件,因为我希望我能通过一些通用的T-Sql得到一个不可知的答案:P

最佳答案

我认为您需要分两步执行此操作。

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

您可以通过导入到临时表(即它们将被丢弃)中,然后插入永久性表中,而忽略旧ID来做到这一点。

或直接将其导入新表(已修改架构以包含旧ID),然后在不再需要旧ID时将其删除。

编辑:

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

基本上没有游标,它逐行地遍历父表,并插入新的partent行以及该父行的所有子行,从而使新的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

希望这可以帮助,

关于sql - 卡住尝试将两个表从一个数据库迁移到另一个数据库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/995999/

10-13 22:23
查看更多