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
我认为您需要分两步完成此操作。
您需要导入旧表并保留旧 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)
希望这可以帮助,