假设我们在数据库中有一个具有以下结构的表:
id(int32),parentId(int32),nodeName,nodeBodyText,...
当然存在某种“树”。
用户将树的某个分支导出到csv / xml / etc文件。
当这个文件被导入到另一个数据库(当然有不同的节点)时,经常会发生id的冲突。
1)具有相同身份证的记录可能已存在
2)Db具有启用了自动递增的id列 (因此您无法为新创建的记录显式指定id)
这个问题通常如何解决? 特别是在nodeBodyText也可能包含与其他节点有关系的文本的情况下 (使用先前数据库中的硬编码ID)
P.S。 使用guid是我们无法接受的。
答案 0 :(得分:0)
假设导入的子树仅具有仅限于该子树的父引用,并且您只插入节点,而不是更新。在SQL Server中,您可以这样做:
您需要一个映射表来存储新旧ID。
declare @idmap table
(
old_id int, new_id int
)
然后使用MERGE命令
插入导入的节点MERGE [target] as t
USING [source] as s ON 1=0 -- don't match anythig, all nodes are new
WHEN NOT MATCHED
THEN INSERT(parentid,nodename) VALUES(s.parentid,s.nodename)
OUTPUT s.id, inserted.id INTO @idmap; -- store new and old id in mapping table
最后重新映射目标表的父ID
update t
set parentid = x.new_id
from [target] t
inner join @idmap x on x.old_id = t.parentid
where t.parentid is not null
and -- only the newly inserted nodes
exists(select * from @idmap where new_id = t.id);