2009-05-26 115 views

回答

7

首先一個鍵的衝突表明無論你目前使用的是什麼過程是一個窮人。

要正確合併兩個正在使用自動生成(non_GUID)鍵的數據庫,您需要執行幾個步驟。首先向父表添加新的自動生成的密鑰,然後從兩個表中導入所有數據,將舊的舊文件重命名爲ID_old,並將新文件重命名爲舊的ID名稱。此時,您可以移動子表。您將需要通過連接到父表並將新的id字段作爲外鍵的值而不是現有表中的值來複制到子表。您需要爲每個外鍵表重複此過程,並且如果該表也是父表,則需要在複製任何數據之前將轉換ID字段添加到表中,以便您可以一直沿着鏈條工作。要正確地做到這一點,需要掌握大量數據庫結構和大量計劃知識。如果沒有兩個源數據庫的良好備份,請不要考慮這樣做。當這兩個數據庫處於單用戶模式時,這個過程也是最好的。

如果您使用自然鍵並有重複項,則會遇到完全不同的問題。所有重複的密鑰記錄都應首先轉移到單獨的表格中,並確定哪些數據應該更準確。在某些情況下,您會發現自然鍵實際上並不是唯一的(它們很少是我爲什麼幾乎不使用它們的原因),並且合併的數據庫需要使用某種類型的自動生成的鍵。這將涉及代碼更改以及數據庫更改,因此它是最後選擇。

你經常用自然鍵找到的是每個數據都是不同的,但是在這種情況下是同樣的(在地址中的聖地亞哥街),在插入時標記其中一個記錄,然後何時在兩個步驟中插入首先是沒有重複的記錄,然後是重複表中標記爲插入的記錄。請記住,您必須檢查所有外鍵表中的所有記錄,以確定要保留哪些內容,哪些不保留。只是丟棄任何重複的東西是一個壞主意,你會以這種方式丟失數據,可能是關鍵數據(如客戶的訂單)。這是一個冗長乏味的過程,需要具有數據專業知識的人來做出判斷。作爲一名程序員,您應該爲他們提供一個重複數據刪除工具,讓他們檢查每組重複數據的所有數據,並選擇要保留的內容和要清除的內容,然後標記爲全部,然後運行插入記錄的過程。記住在你的設計中,對於真正的重複,將會有一些子表(例如訂單)需要來自兩者的記錄,這兩個記錄被髮送到數據庫以用於選擇要記錄的記錄(訂單是示例),其他表你會想要選擇哪個是正確的(例如地址)。所以你可以看到這是一個複雜的過程,需要對數據庫有透徹的理解。

如果您有很多重複項,它們可能會清理並將數據添加數個月,所以工具非常重要。做這件事的人可能是系統用戶而不是數據庫專家或程序員,因爲他們是唯一真正能夠判斷哪個記錄保持最大的判斷的人。可能您需要在任何情況下都會做出類似的事情,因爲即使您有自動生成的密鑰,也可能有重複的記錄。他們更難找到。

有沒有簡單的方法來合併兩個數據庫(即使使用GUIDS,你有自然鍵中的重複問題)。

4

最好的辦法可能是與第三方應用程序,如RedGate SQL Data Compare。花費一些錢,但它是值得的寫腳本國際海事組織。

+2

有什麼開源的選擇! – Ish 2009-05-26 10:06:24

0

對於如果您有主鍵爲IDENTITY這裏是我的建議(不應該要求修改架構)。

  1. 設立的所有外鍵,以便ON UPDATE CASCADE設置
  2. 更新的主鍵/標識字段父表並添加你要合併到相應的表領域的最高值(然後FKS將從this forum answer級聯值的子表)
  3. 執行相同的子表
  4. 按照建議的PK /標識字段,並使用插入每個表中的SET IDENTITY_INSERT ON/OFF兩側,從父表開始,然後移動到子表
5

我知道這是一個老話題,但我有很多的職位的一般方法我看到評論,並正在試圖使用SQL查詢本身做的一切。這些解決方案的共同之處在於,在應用它之前需要花費相當大的時間來創建和測試查詢。

所以,是的 - 你可以合併使用本身比較複雜的查詢,兩個數據庫,但是你可以爲自己節省大量的時間和使用第三方工具免費(大部分或全部具有全功能的免費試用)。

市場上有很多這樣的產品。紅門,在其他崗位已經提到的,是最好的一個,但你也可以嘗試ApexSQL Data DiffdbForgeSQL Comparison toolset等等。

0

你可以只添加其他字段(稱爲DatabaseID爲例)的所有表在合併數據庫,並把它添加到主鍵。這樣你就可以保持原來的鑰匙,而在合併後的數據庫具有獨特的鍵 - 你可以告訴了行,來自哪個數據庫。這就是SQL-Hub所做的 - 如果只是一項工作,您可以免費試用。

相關問題