2

假設您有兩個表處於一對一關係;即子表的主鍵也是將其鏈接到父表的外鍵。還假定父項的主鍵是標識字段(插入記錄時由數據庫分配的單調遞增整數)。在SQL中複製與標識字段的1對1關係

假設您需要將這兩個表中的記錄複製到第二對相同的表中 - 父項的主鍵是標識,將子項鍊接到父項的外鍵也是子項的主鍵。

我應該如何將一組表中的記錄複製到另一組表中?

我目前有三個解決方案,但我想知道是否還有其他人更好。

  • 選項1:在目的地 父表暫時禁用 身份屬性。複製來自 父表的記錄,然後複製子表 保持 主鍵的相同值。跨越你的手指, 沒有衝突( 源表的主鍵已在目標表中存在 )。

  • 選項2:暫時列添加到 目的地父表保持 「舊」(源)主鍵。從父表中複製 記錄, 允許數據庫分配新的主鍵 ,但將舊主鍵保存在臨時列中。 從子表, 通過的 舊的主鍵加入源子表的 目的地父表複製記錄,利用加盟 插入記錄到 目的地子表與新 主鍵。從目標父 表中刪除臨時 列。

  • 選項3:複製順序 記錄由記錄,首先從父 到父,然後兒童對兒童,使用 DB-提供的功能的「最後 插入記錄的身份」,以確保 該鏈接保持不變。

在這些選項中,我認爲選項2是我的偏好。有沒有人更喜歡其他兩種選擇之一,如果是這樣,爲什麼?有沒有人有不同的「更好」的解決方案?

回答

1

這就是爲什麼記住即使使用代理鍵(如標識列)也非常重要的原因之一,您總是需要一個業務密鑰。也就是說,表格中總是需要有一些其他的唯一約束條件。如果有,則另一種選擇是將值插入父表的副本中,而不使用標識值,並使用該唯一鍵爲子行插入正確的父值。

如果您沒有這個唯一的密鑰,那麼考慮到您的情況,我同意您的最佳解決方案可能是選項2。

+0

不幸的是,雖然大多數表具有自然的組合業務密鑰,但有三個表沒有。 :( – 2011-03-08 23:12:38

0

你決定的方法將數據複製到一組新表之前,您應該研究以下項目:

  1. 引用從父和子表中的數據(這兩套表格的表的列表)
  2. 是否有任何存儲過程/觸發器利用這些表中的數據?
  3. 此表如何填充?有沒有在此表中插入數據的應用程序/數據饋送?
  4. 此表中的數據如何刪除?
  5. 除了確保表中的唯一性之外,主鍵的用途是什麼?爲此,您將必須瞭解應用程序如何使用表中的數據。

根據答案,您應該能夠選擇符合應用要求的正確解決方案。

0

我的錢在選項1上(請參閱SET IDENTITY INSERT,http://msdn.microsoft.com/en-us/library/ms188059.aspx)。

但是:你爲什麼要複製它們?

  • 如果你只是改變表模式,或遷移到新表和退役舊的,爲什麼不使用ALTER TABLE
  • 如果您要並排運行它們,您可能需要按鍵才能匹配。

但回答你的問題,絕對使用選項1。