2014-01-15 77 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 
) 

然後插入導入的節點