2012-05-31 44 views
1

我有兩個表具有不同的模式:如何在不同服務器上的MySQL基礎之間遷移數據?

基A,表T1:

`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`title` varchar(255) NOT NULL DEFAULT '', 
`uid` int(11) NOT NULL DEFAULT '0', 
`language` varchar(12) NOT NULL DEFAULT '' 

基B,表T2:

`ID` int(11) NOT NULL AUTO_INCREMENT, 
`Type` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL, 
`UserID` int(11) NOT NULL, 
`Name` varchar(100) COLLATE utf8_unicode_ci NOT NULL, 

我需要將數據從T1轉移到T2這樣:

A.T1.id -> B.T2.ID 
A.T1.title -> B.T2.Name 
A.T1.uid -> B.T2.UserID 

正如你所看到的字段不需要3210和B.T2.Type

我想我應該通過轉儲的CSV做這種遷移。但這就是我所想到的。

有什麼想法?

UPDATE

謝謝你們對你的答案。請原諒我不夠清楚,我應該強調我的桌子位於不同的基地,甚至在不同的服務器上。所以它不如從一個表格中的字段插入另一個表格那麼簡單。

回答

2

您可以UPDATESELECT查詢的組合做到這一點。然而,由於TABLE 1的列title的類型爲VARCHAR(255)TABLE 2的列Name其類型爲VARCHAR(100)可能會導致問題。

下面的查詢可以做到這一點的遷移然而任何行具有列title長度超過100將縮短到100

INSERT INTO T2 
(ID, Name, UserID) 
SELECT id, SUBSTR(title, 0, 100), uid 
FROM T1 
+0

+1注意到需要截斷 –

+0

最後,我在具有前綴的同一個基礎中添加了目標表,傳輸了數據,然後創建了這些表的轉儲。 –

1

使用INSERT ... SELECT語法在

INSERT INTO `B`.`T2` (`ID`, `Name`, `UserID`) 
SELECT `id`, `title`, `uid` FROM `A`.`T1` 
1

他們是在同一個數據庫?在這種情況下:

INSERT INTO T2 (ID, Name, UserID) 
SELECT id, title, uid FROM T1 
1

我有什麼理由,你爲什麼要限制添加到您的int字段,如INT(10)而不是INT?

您的數據傳輸說明與您的基表不符?

無論如何,你可能在這裏運行int的問題是,你的一些列限制是不同的,所以你必須使它們相同,或者如果源列中的字符串比目的地長,則將它們SUBSTRING到目標表中列如果您嘗試在VARCHAR(10)列中插入「This is my string」,則會出現截斷錯誤。

爲了將數據插入到目標表中您可以使用此:

INSERT INTO [Destination Table] (ID, Name, uid) 

SELECT 
    ID, 
    SUBSTRING(title, 0, 100) as 'Name', 
    uid 
FROM 
    [Source Table] 

這將工作但你會犧牲上的名稱列中的數據。我會建議給你的目標列與源表相同的數據類型和限制。

相關問題