2016-02-08 85 views
1

我正在將數據從舊數據庫導入新數據庫。其中一個表有超過3000萬行,我必須從OLD DB中獲得相同的PK值。遷移之後,我必須開發用於將數據插入到該表中的存儲過程。我的問題是:我應該將PK(遷移後)設置爲身份還是插入數據時,找到PK的最大值並將其增加1,然後插入? 如果我應該使用第一種方法,我該怎麼辦?我試過通過Management Studio來做,但由於超時異常,它總是失敗。如果我應該使用第二種方法,是否線程安全並降低性能?插入一個大表中,PK不是身份

謝謝!

此致 Turik

回答

0

推薦的方法是降所有指數,包括主鍵,當批量加載數據,因爲它加快了負載和減少了對事務日誌的負載。但是,您需要確保在加載之前將IDENTITY屬性添加到新表中,並使用SET IDENTITY_INSERT .... ON允許您插入舊的標識值。

在這個例子中,我們假設這個目標表:

CREATE TABLE dbo.YourTable(YourTableId INT IDENTITY(1,1), SomeData INT) 

然後,您需要使用IDENTITY_INSERT...ON,以確保您可以從源表插入數據:

SET IDENTITY_INSERT dbo.YourTable ON 

--copy data from source table 
INSERT INTO dbo.YourTable 
(YourTableId, SomeData) 
SELECT 1,1 
UNION 
SELECT 2,2 

之後,你有遷移數據,您需要再次關閉IDENTITY_INSERT

SET IDENTITY_INSERT dbo.YourTable OFF 

添加主鍵:

ALTER TABLE dbo.[YourTable] ADD CONSTRAINT PK_YourTable_YourTableID PRIMARY KEY CLUSTERED (YourTableID) 

然後與RESEED值等於當前最大的PK值

DBCC CHECKIDENT ('[YourTable]', RESEED, 2) 

運行此命令後補種主鍵,這個記錄將與插入值爲3 YourTableId

INSERT INTO dbo.YourTable 
SELECT 3 
+0

好的,但dbcc只有在我的表中有一個標識列的情況下才有效。我面臨的另一個問題是,爲具有如此多記錄的表添加身份。我怎麼解決這個問題?它總是超時。 –

+0

對不起,我在你的回答較短時(初始版本)添加了評論。 –