我有两个具有不同模式的表:
基地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.language
和B.T2.Type
。
我想我应该通过转储CSV进行迁移。但这就是我所要做的。
有什么想法吗?
更新
谢谢你们的回答。请原谅我不够清楚,我应该强调我的桌子有不同的基础,甚至在不同的服务器上。因此,将字段从一个表插入另一个表并不容易。
答案 0 :(得分:2)
您可以结合UPDATE
和SELECT
查询来执行此操作。但是,由于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]
这将有效,但您将牺牲名称列上的数据。我建议为目标列提供与源表相同的数据类型和限制。