导出/导入树(id的冲突)

时间:2014-01-15 14:28:24

标签: sql import tree export

假设我们在数据库中有一个具有以下结构的表:

id(int32),parentId(int32),nodeName,nodeBodyText,...

当然存在某种“树”。

用户将树的某个分支导出到csv / xml / etc文件。

当这个文件被导入到另一个数据库(当然有不同的节点)时,经常会发生id的冲突。

1)具有相同身份证的记录可能已存在

2)Db具有启用了自动递增的id列 (因此您无法为新创建的记录显式指定id)

这个问题通常如何解决? 特别是在nodeBodyText也可能包含与其他节点有关系的文本的情况下 (使用先前数据库中的硬编码ID)

P.S。 使用guid是我们无法接受的。

1 个答案:

答案 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);