2016-11-04 40 views
0

我有一個網站,有一個非常古老和設計糟糕的數據庫(MySQL)。我正在創建一個新版本的網站,我已經定義了另一個數據庫(MySQL),當然這是更好的設計(規範化的ea)將數據庫複製到另一個數據庫與其他結構

現在我有將舊數據庫的數據傳輸到新數據庫的問題。我不能使用mysqldump作爲表格的佈局和引用e.a.是完全不同的,儘管一些屬性是相同的。

所以我的問題是什麼是這種工作的最佳做​​法。例如。

的表Customer與屬性namestreetsomething unimportantCustomer表屬性namestreetsomething new and important

什麼與外鍵E.A.表?

親切的問候

延Buysse的

+1

如果您沒有足夠小心從當前結構開始並保留'ALTER TABLE'語句,則需要編寫自定義數據遷移腳本。沒有標準的第三方工具可以幫你。 –

回答

1

有沒有真正明確定義這樣的方法 - 它更是一個手動任務,確定如何將數據。 ETL(提取,轉換和加載)的一種形式。

從您的基表開始,並編寫一些插入語句以獲取核心數據,並根據情況進行轉換。然後轉到相關數據的「下一級」並重復,直到您複製了所有信息。

請注意,通常情況下,新的理想模式不能完全實現(包括所有約束等)與遺留數據庫,因爲某些信息可能會丟失。在這些情況下,您必須a)在加載過程中根據需要生成數據,或者b)關閉約束條件,以便您可以加載舊數據,直到這些數據被清理到足以執行它們。總之,這是一種非常場景的類型,在大多數情況下都傾向於手動處理。無論如何,據我所知,

最後,我和MySQL一起工作已經有一段時間了,但是大多數數據庫引擎允許某種類型的兩部分命名,所以您可以從一個腳本中訪問兩個單獨的數據庫(在同一臺服務器上),所以插入語句可能最終這樣看:

INSERT INTO newdb.newtable (thisfield, thatfield) 
SELECT thisfield, thatfield FROM olddb.oldtable; 

(應用,當然適用的轉換)

1

開始從舊的SQL腳本,並手動刪除所有在新的數據庫結構不存在不重要列:

INSERT INTO customers ('name','surname','age') VALUES ('john','brown', 27); 

成爲

INSERT INTO customers ('name','surname') VALUES ('john','brown'); 

指定一個默認值來插入新的數據庫新列,如果需要執行插入腳本之後刪除此默認值。

使用一些編輯器,複製/替換生成的腳本使其變得簡單。或者將臨時表中的舊錶複製並從中選擇所需的字段以將數據插入到新表中。

INSERT INTO customer (
    SELECT 'name','surname' FROM customers_old 
) 

在這種情況下,一個自動化的方法是很難找到的,因爲數據庫結構是由您和手動的方法是在我看來,更好地在這裏。

+0

MySQL是否有'INSERT INTO thisdb.thistable(fields)SELECT fields from thatdb.thattable' syntax? (我已經使用它已有數年了) – jleach

0

您可以用您選擇的語言編寫一個程序,將數據從1個DB(表格)移動到另一個,只移動所需的列數據。你可以在網上找到很多相同的例子

爲了處理外鍵方案,你可以將數據從列中移出,由於規範化需要移動到其他表中,你可以通過程序本身作爲程序來處理將在該行的每個條目上工作,因此您可以自由地將行中的每個條目移動到您想要的任何表格(或者維護一個臨時的Excel表格,其中每個表格表格都是一個表格並根據需要向此Excel中添加數據),然後將數據添加到通過導入它從此Excel中創建的新表架構

相關問題