如何在不同服务器上的MySQL基础之间迁移数据?

时间:2012-05-31 11:11:25

标签: mysql sql database-migration

我有两个具有不同模式的表:

基地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

如您所见,不需要字段A.T1.languageB.T2.Type

我想我应该通过转储CSV进行迁移。但这就是我所要做的。

有什么想法吗?

更新

谢谢你们的回答。请原谅我不够清楚,我应该强调我的桌子有不同的基础,甚至在不同的服务器上。因此,将字段从一个表插入另一个表并不容易。

4 个答案:

答案 0 :(得分:2)

您可以结合UPDATESELECT查询来执行此操作。但是,由于TABLE 1的列title的类型为VARCHAR(255),而TABLE 2的列Name的类型为VARCHAR(100),因此可能会提供问题

以下查询可以执行此迁移,但列title的长度超过100的任何行都将 SHORTENED 设置为100。

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

答案 1 :(得分:1)

使用

中的INSERT ... SELECT语法
INSERT INTO `B`.`T2` (`ID`, `Name`, `UserID`)
SELECT `id`, `title`, `uid` FROM `A`.`T1`

答案 2 :(得分:1)

他们是否在同一个数据库中?在那种情况下:

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

答案 3 :(得分:1)

我有什么理由要为你的int字段添加限制,例如INT(10)而不仅仅是INT?

您的数据传输说明与您的基表不一致吗?

无论如何,你可能在这里运行的问题是你的一些列限制是不同的,所以如果源列中的字符串比目标列长,你要么必须使它们相同,要么将它们SUBSTRING到目标表中例如,如果您尝试将“This is my string”插入VARCHAR(10)列,您将收到截断错误。

要将数据插入目标表,您可以使用:

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

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

这将有效,但您将牺牲名称列上的数据。我建议为目标列提供与源表相同的数据类型和限制。