Sql-Server

在保持它們之間的引用完整性的同時移動具有標識鍵列的表的最簡單方法是什麼?

  • February 7, 2020

我在數據庫 A 中有四個表,它們具有標識鍵列,並且在這些列上具有彼此的外鍵引用(沒有創建實際的外鍵對象,只是列本身)。

我需要將這些表中的所有數據移動到數據庫 B 中關聯(幾乎)相同的表中。(數據庫 B 中的表中也已經有數據,所以我正在嘗試附加這些數據。)

如何將數據移動到數據庫 B,這將為每個表的記錄生成新的鍵值,但不會破壞參照完整性。

由於您將擁有新的 id 值,因此直接複製並不容易。

我可能會建議將數據複製到一組沒有定義外鍵的臨時表中。然後,在臨時表中,將給定表中所有行的現有 ID 值增加一個固定量,以保證它們高於目標表中的最大值(或者如果你沒有,你可以將它們更改為負值’ t 已經使用過這些) - 您需要同時對任何子表中的外鍵欄位應用相同的更新。

然後您可以使用SET IDENTITY_INSERT {TableName} ON;允許您將更新的記錄插入到目標表中。完成後,您應該再次將其關閉。

SQL Server 將自動考慮您插入的新行,以便為向前移動的新記錄重新播種標識值,因此一旦您插入記錄,一切都很好。

添加Matthew McGiffen回答的另一個方面,我建議從源數據庫表執行 bcp 到每個這些表的 4 個文件,然後 bcp 到目標數據庫的 tempdb。這些表將是普通表,即沒有任何引用完整性,之後您可以在源表中定義對它們的依賴關係,這將成功,因為它在源數據庫中工作。

添加使用 BCP 而不是其他方法的說明是非常簡單的原因,如果這些伺服器是生產和測試的,則不需要設置防火牆。與導出/導入和 SSRS 相比,BCP 對我來說更快,但這是我的經驗,非常值得商榷。

上述成功完成後,啟用後就很容易從實體關係圖中的最後一個表開始插入到目標表中SET IDENTITY_INSERT {Target TableName} ON。一旦為所有表完成此操作並設置關係,您就可以開始了。

以上希望有所幫助。

引用自:https://dba.stackexchange.com/questions/258955