如何跨数据库复制父子表数据并将新生成的父ID映射到子表外键列
可行解决方案
方案1:使用IDENTITY_INSERT保留源端ID(优先推荐)
IDENTITY_INSERT是SQL Server的会话级临时配置,不会修改表结构或属性,完全符合限制要求。开启后可以直接插入源端的自增主键值,无需调整外键关联,数据完全和源端一致:
-- 1. 导入班级表,保留原有ID SET IDENTITY_INSERT server2.dbo.tblClass ON; INSERT INTO server2.dbo.tblClass (ID, Name) SELECT ID, Name FROM server1.dbo.tblClass; SET IDENTITY_INSERT server2.dbo.tblClass OFF; -- 2. 直接导入学生表,原有Class_ID完全匹配,无需调整 SET IDENTITY_INSERT server2.dbo.tblStudents ON; INSERT INTO server2.dbo.tblStudents (ID, Name, Class_ID) SELECT ID, Name, Class_ID FROM server1.dbo.tblStudents; SET IDENTITY_INSERT server2.dbo.tblStudents OFF;
方案2:通过业务唯一字段映射关联(适用于无法开启IDENTITY_INSERT的场景)
如果规则不允许开启IDENTITY_INSERT,可以用班级名称(或其他业务唯一字段)作为关联桥梁,插入学生表时替换为目标端的新班级ID:
- 先正常导入班级表,生成新的自增ID:
INSERT INTO server2.dbo.tblClass (Name) SELECT Name FROM server1.dbo.tblClass;
- 导入学生表时关联源端和目标端的班级表,用班级名称匹配拿到新的Class_ID:
INSERT INTO server2.dbo.tblStudents (Name, Class_ID) SELECT s.Name, c_new.ID FROM server1.dbo.tblStudents s INNER JOIN server1.dbo.tblClass c_old ON s.Class_ID = c_old.ID INNER JOIN server2.dbo.tblClass c_new ON c_old.Name = c_new.Name;
注意:该方案要求
tblClass的Name字段唯一无重复,如果有班级编号等其他唯一业务字段,建议替换为该字段做关联,避免重名导致映射错误。
内容的提问来源于stack exchange,提问作者Robbie Robertson
相关产品推荐
相关产品推荐

