2014-01-15 50 views
1

假设我们用下面的结构数据库中有一个表:导出/导入树(ID的冲突)

ID(INT32),parentId的(INT32),节点名称,nodeBodyText,...

中当然,某种“树”存储在那里。

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

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

1)记录有相同ID的可能已经存在

2)德意志与id列上的自动递增启用 (所以你不能明确指定ID为新创建的记录)

这个问题通常如何解决? 特别是在nodeBodyText也可以包含与其他节点的关系的文本 (使用来自先前的db的硬编码ID)

P.S. 我们不接受guid的使用。

回答

0

假设导入的子树仅具有父引用而仅限于该子树,并且仅插入节点而不进行更新。在SQL服务器中,您可以这样做:

您需要一个映射表来存储新旧ID。使用合并命令

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 

最后重新映射的目标表的父IDS

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

declare @idmap table 
(
old_id int, new_id int 
) 

然后插入导入的节点