2012-01-25 78 views
2

我有我的應用程序部署在兩個單獨的區域說美國西部和歐盟,這兩個應用程序都有自己的數據庫。現在我想把歐盟地區的數據庫移到美國西部。如何解決主鍵衝突,同時合併一個分貝與其他

這將導致主鍵衝突,因爲這兩個數據庫都有相同的主自動遞增ID的表,任何人都可以給我建議來解決這個問題。

方案:從DB1 用戶表(比如從US-WEST)具有DB2(歐盟說)以下條目

ID Name 
1 Rob 
2 San 
3 Tulip 

用戶表具有以下條目

ID Name 
1 John 
2 Michael 
3 Natasha 
+4

是你的表中的ID加入到其他表(外鍵等)?然後你必須考慮改變整個數據庫中的ID。 –

回答

1

打開關閉目標數據庫中的自動增量。然後首先從DB1和DB2中導入數據。在從DB2導入時,添加一個比第一個DB中的最高ID更高的常數值。像這樣:

insert into destination_table 
    select id + 10000, othercolumns from source_table 

導入數據後,您可以再次打開自動增量。

編輯:

如果其他表的id列的引用,則此方法將打破關係到這些表。

+2

@juergen_d請注意,這將破壞DB2中所有用戶的可能關係 –

0
  1. 刪除主鍵並關閉自動遞增從ID字段您的目標數據庫表。

  2. 然後首先從兩個數據庫導入數據。

  3. 從目標表中刪除ID列。

  4. 再次創建id列使該列auto increamentprimary key

1

我覺得你有你的目標DB與例如regionID列擴展和修改表格的主鍵設置。使用主密鑰和兩列IDregionID。然後像這樣從兩個表導入數據:

Insert into destination_table values(regionID, ID, Name) 
select 1,ID, Name from DB1 

Insert into destination_table values(regionID, ID, Name) 
select 2,ID, Name from DB2 

現在,棘手的部分。您必須對所有表格執行此操作,您將ID用作關係。傳輸完所有數據後,您只需編輯您的SQL語句即可將regionIDID組合爲鍵。

7
  • 對於兩個原始數據庫中的每一個(說db0db1):

    • 備份數據庫。

    • 鎖定數據庫僅供此腳本使用。

    • 對於數據庫中所有定義了外鍵的表格,如果沒有定義ON UPDATE CASCADE,請使用此選項更改所有這些外鍵約束。

    • 對於具有auto_increment(或一個簡單的整數)主鍵每個表,運行這個(在級聯更新將其餘部分):

  UPDATE TableX 
      SET Pk = 2 * Pk - 0   --- for db0 
      ORDER BY Pk DESC 

      UPDATE TableX 
      SET Pk = 2 * Pk - 1   --- for db1 
      ORDER BY Pk DESC 
  • 出口從每個數據庫中的表。

  • 現在通過合併相應的表格來合併兩個數據庫。所有來自db0的數據都將具有偶數個ID,並且所有來自db1的數據都將具有奇數個ID。沒有碰撞。

  • 對於沒有自動遞增主鍵或對於可能具有公共行的表的表,合併應該是不同的,當然。

  • 解鎖。


你可以閱讀有關auto_increment_increment和相關的系統變量,你可以從這個角度如此改變,這兩個數據庫產生不同的自動遞增的ID(一個奇怪的ID,其他甚至是那些)。