2012-01-12 140 views
1

我有兩個數據庫具有相同的設計,而不同的記錄在MySQL 有一個唯一的主鍵兩個主表。 (我的意思是,如果兩個記錄在不同的數據庫具有相同的主鍵,他們是相同的。)合併兩個數據庫具有相同的設計(MySQL的)

這兩個表有一定的多對多關係,其他表。但問題是小表的PK是不是在所有的數據塊(自動遞增)獨特

現在我要合併這兩個數據庫的數據。

任何想法?

+0

請附上您的代碼/數據庫結構,使我們可以看到,到目前爲止你有什麼並更好地瞭解you'ld一樣,如果你使用的是自動增量的主鍵做什麼 – Tom 2012-01-12 20:48:47

+0

,您的企業平等的假設是錯的。 – 2012-01-12 21:10:08

+0

你需要主鍵保持不變嗎? – 2012-01-12 21:49:01

回答

2

編輯:我想我誤解了你的說法,即關鍵字在數據庫中是唯一的。在這種情況下,如果它已經在目標數據庫中,我不會插入原始數據庫中的一行。您仍然可以使用相同的外鍵複製外鍵表。

所以基本上:

INSERT INTO MainTable (PK, field1, field2) 
SELECT (PK, field1, field2) 
FROM OldMainTable 
WHERE PK NOT IN (SELECT PK FROM MainTable) 

以防萬一下方留下舊的答案。

最好的辦法是修改表格,使其具有OldPrimaryKey字段。然後,當您將數據插入目標數據庫時,將原始PK存儲在OldPrimaryKey字段中。然後,當你用外鍵插入任何東西時,看起來與FK一致,直到OldPrimaryKey字段,並更新外鍵以匹配。 (可能是一個好主意,以防萬一創建外鍵的副本,以及!)

所以查詢可能是這個樣子:

INSERT INTO MainTableTarget (OldPrimaryKey, field1, field2...) 
SELECT PrimaryKey as OldPrimaryKey, field1, field2... 
FROM OldMainTable 

INSERT INTO Table2Target (OldTable2PK, MainTableForeignKey, fielda, fieldb...) 
SELECT Table2PK as OldTable2PK, 
     (SELECT PK FROM MainTableTarget) as MainTableForeignKey, --This get the FK to point at the newly created database record 
     fielda, 
     fieldb 
FROM OldTable2 

這可能會是一個痛苦,但我不覺得有任何不痛苦選擇這裏...

哦,對不起,如果語法是有點過。我是一個T-SQL傢伙,所以真的不知道MySQL的語法。希望你的想法,雖然...

1

最簡單的方法很可能是使用這樣的查詢爲每個表:

INSERT IGNORE INTO db2.sometable 
SELECT * FROM db1.sometable 

只要確保你處理以正確的順序表,這樣你就不會遇到國外的關鍵問題(如先做兩個主表,然後是相關表格)

+0

沒有辦法不會遇到外鍵問題。忽略這個錯誤並不會讓它神奇地消失... – CodeRedick 2012-01-12 21:35:26

+0

他以正確的順序說...如果對錶依賴關係進行拓撲排序,你可以做到這一點。 – 2012-01-12 21:42:32

+0

@Telos - 他已經說過兩個具有相同PK的記錄是相同的,所以使用INSERT IGNORE是合適的。 – 2012-01-12 21:59:59

2

這個答案在很大程度上取決於你的假設:「如果兩個記錄在不同的數據庫具有相同的主鍵,他們都是一樣的。」 假設你的數據是乾淨的,設置外鍵檢查爲0,然後

INSERT INTO db2.sometable 

SELECT * FROM db1.sometable on duplicate key ignore 

,而不是插入忽視,這將忽略任何錯誤不只是複製。對每個表執行此操作,然後將外鍵檢查設置爲1.如果要保證安全,可以對拓撲表進行排序並首先插入根表,同時保持外鍵檢查處於活動狀態。如果您擁有合成主鍵,則所有投注都將關閉,您將需要重新分配鍵,這非常困難。

+0

我想我喜歡這個答案比我更好,因爲你提到的錯誤處理的原因。 – 2012-01-17 14:24:57

相關問題