我正在將數據從舊數據庫導入新數據庫。其中一個表有超過3000萬行,我必須從OLD DB中獲得相同的PK值。遷移之後,我必須開發用於將數據插入到該表中的存儲過程。我的問題是:我應該將PK(遷移後)設置爲身份還是插入數據時,找到PK的最大值並將其增加1,然後插入? 如果我應該使用第一種方法,我該怎麼辦?我試過通過Management Studio來做,但由於超時異常,它總是失敗。如果我應該使用第二種方法,是否線程安全並降低性能?插入一個大表中,PK不是身份
謝謝!
此致 Turik
我正在將數據從舊數據庫導入新數據庫。其中一個表有超過3000萬行,我必須從OLD DB中獲得相同的PK值。遷移之後,我必須開發用於將數據插入到該表中的存儲過程。我的問題是:我應該將PK(遷移後)設置爲身份還是插入數據時,找到PK的最大值並將其增加1,然後插入? 如果我應該使用第一種方法,我該怎麼辦?我試過通過Management Studio來做,但由於超時異常,它總是失敗。如果我應該使用第二種方法,是否線程安全並降低性能?插入一個大表中,PK不是身份
謝謝!
此致 Turik
推薦的方法是降所有指數,包括主鍵,當批量加載數據,因爲它加快了負載和減少了對事務日誌的負載。但是,您需要確保在加載之前將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
好的,但dbcc只有在我的表中有一個標識列的情況下才有效。我面臨的另一個問題是,爲具有如此多記錄的表添加身份。我怎麼解決這個問題?它總是超時。 –
對不起,我在你的回答較短時(初始版本)添加了評論。 –