2012-05-31 41 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] 

这将工作但你会牺牲上的名称列中的数据。我会建议给你的目标列与源表相同的数据类型和限制。

相关问题