【问题标题】:How to migrate data between MySQL bases on different servers?如何在不同服务器的 MySQL 库之间迁移数据?
【发布时间】:2012-06-05 15:25:54
【问题描述】:

我有两个不同模式的表:

基础 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 转储来进行此迁移。但这就是我想出的全部。

有什么想法吗?

更新

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

【问题讨论】:

    标签: mysql sql database-migration


    【解决方案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]
    

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

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 最后,我在同一个库中添加了带有前缀的目标表,传输数据,然后创建了这些表的转储。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        使用INSERT ... SELECT 语法,如

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

        【讨论】:

          猜你喜欢
          • 2017-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-04
          • 2020-12-08
          • 2018-04-13
          相关资源
          最近更新 更多