1

我有两个具有不同架构的表:

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

4 回答 4

2

您可以使用UPDATESELECT查询的组合来做到这一点。但是,由于TABLE 1具有类型的列并且具有title类型的列可能会产生问题。VARCHAR(255)TABLE 2NameVARCHAR(100)

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

INSERT INTO T2 
(ID, Name, UserID) 
SELECT id, SUBSTR(title, 0, 100), uid 
FROM T1
于 2012-05-31T11:20:39.470 回答
1

使用如下INSERT ... SELECT语法

INSERT INTO `B`.`T2` (`ID`, `Name`, `UserID`)
SELECT `id`, `title`, `uid` FROM `A`.`T1`
于 2012-05-31T11:13:50.457 回答
1

它们在同一个数据库上吗?在这种情况下:

INSERT INTO T2 (ID, Name, UserID) 
SELECT id, title, uid FROM T1
于 2012-05-31T11:13:59.453 回答
1

我有什么理由必须将限制添加到您的 int 字段,例如 INT(10) 而不仅仅是 INT?

您对数据传输的解释与您的基表不一致?

无论如何,您可能在此处遇到的问题是您的某些列限制是不同的,因此如果源列中的字符串比目标列长,您要么必须使它们相同,要么将它们SUBSTRING 到目标表中,例如如果您尝试将“这是我的字符串”插入 VARCHAR(10) 列,您将收到截断错误。

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

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

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

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

于 2012-05-31T11:38:54.833 回答