2014-06-27 63 views
0

我們正在將數據庫主鍵從GUID轉換爲自動遞增的INT。我們從文本文件中解析出數據,並將它們放入兩個C#數據表ClaimClaimCharge中,我們一直使用它們批量插入數據庫中的同名表中。在數據庫中,ClaimCharge.ClaimIDClaim.ID的外鍵,對於一個索賠存在多個索賠費用。批量插入與未知自動遞增ID相關的數據集

使用GUID我們在C#中生成了ClaimClaimCharge ID,因此批量插入不成問題。但對於INT,我不知道Claim.ID會是什麼,所以我不能指定ClaimCharge.ClaimID。我需要一些關於如何用INT來完成的想法。

例如,如果Claim表可以被手動鎖定以防止嵌件,我可以:

  1. 批量插入到名爲ClaimBulkDataClaimChargeBulkData備用表。爲了方便保持C#和SQL之間的關係,這些表仍然使用GUID。
  2. 手動鎖定Claim表對插入(不知道這是否可能)並獲得最大(ID)。
  3. 使用MAX(ID)遞增ClaimBulkData中的所有數據。
  4. ClaimChargeBulkDataClaimBulkData使用新近更新INT
  5. 作爲一組使用 IDENTITY_INSERT ON使用某種例外在步驟2中創建
  6. 手動創建的鎖對插入件上推出假想鎖
  7. 將數據插入真實ClaimClaim表(再次,我不知道這是可能的。
  8. 將數據插入到真正ClaimCharge表。

我想避免inser在C#或T-SQL中一次一行地處理數據。

+0

使用此版本:Microsoft SQL Server 2008(SP3) - 10.0.5512.0(X64)。 Aug 22 2012 19:25:47。版權所有(c)1988-2008 Windows NT 6.0上的Microsoft Corporation標準版(64位)(內部版本6002:Service Pack 2) –

+0

感覺就像您正在對付SQL Server,而不是讓它爲您工作。爲什麼不只是在他們來到時插入記錄,而是在獲得X條記錄之後再進行批量插入?感覺就像你要遇到主要的參照完整性問題。 –

+0

這是另一個想法。 http://stackoverflow.com/questions/5365629/using-merge-output-to-get-mapping-between-source-id-and-target-id –

回答

1

爲什麼不只是新的自動增量列添加到主表 - 那麼你將有兩個GUID和自動識別列,這樣就可以解決了外鍵關係(每次一個主表)

即,

假設你有master1和detail1和detail1

alter table Master1 add ID int identity(1,1) not null 
GO 

alter Detail1 add master1ID int null 
GO 
alter Detail2 add master1ID int null 
GO 

然後更新基礎上的oldguid鍵加入master1設置Master1ID的對應值的每個表detail1和Detail12

然後,您可以添加基於Master1ID細節和Detail2

外鍵此時,你應該有一個完整的基於兩套鑰匙的數據,並且可以測試更新的看法等方面做出確定它們使用新的整數ID

最後,一旦所有的東西都很酷,就放棄不需要的GUID外鍵和Guid列本身。

如果您的意圖是通過此次重組來減少整體磁盤使用量,那麼您可以隨時運行一個數據庫包,以便將所有內容都清理乾淨並進行轉換。重點是大部分工作都是在這樣的過程中修改外鍵。

+0

非常酷,很棒的主意!你吹我的腦袋!愛它的簡單性。 –

+1

抱歉,心靈井噴,聽起來很痛苦。 –

+0

多一點背景:插入主/細節是一個日常的業務流程,所以我將無法刪除列。空間是一個問題,但轉換的主要問題是查找/插入性能。因此,現在的計劃是離開舊的guid列並將它們重命名爲BulkUpdateReferenceId,因此很明顯它們的用途。每次插入/鍵修復後,我想我可以將它設置爲空以節省空間?但是這樣,在任何guid列上都沒有索引,也沒有使用它們的查找,除了你描述的最初的FK修復。 –