暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

通过一个sql语句,如何做到把1个表的数据插入到另外1个表

Java修炼记 2021-04-07
1537

阅读本文大概需要 5 分钟。

前言

     有时候,我们往往有这种需求:需要把1个表某几个字段的数据根据条件查询出来,再插入到另外一个表。这就是表与表之间数据的转移。

     这种场景,一般是同步历史数据需要。

     假定这两个表分别是A表和B表,并且表结构不一样,只是有部分字段含义一致。

     如果数据少还好说,直接在需要插入数据的表中,手工录入即可。但要是成千上万呢,那手工方式肯定是不行的。下面请看示例,通过sql如何实现。

一、数据准备

1.表结构

1) 创建帮助表 t_help

    CREATE TABLE `t_help` (
    `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `user_id` int(10) DEFAULT NULL COMMENT '用户ID',
    `problems` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '问题描述',
    `create_date` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='帮助表';

    2) 创建回复表 t_reply

      CREATE TABLE `t_reply` (
      `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
      `help_id` int(10) NOT NULL COMMENT '帮助表_主键ID',
      `problems` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '问题描述',
      `reply` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '回复内容',
      `create_date` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
      PRIMARY KEY (`ID`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='回复表';

      2.表数据

      1)给帮助表 t_help 插入数据

      此时回复表  t_reply 数据为空,未插入任何数据

      二、需求

          想把 帮助表 t_help 的数据转移到 回复表 t_reply,字段值对应关系如下:

          t_help 表                            t_reply 表

          problems          -->              problems

          id                      -->              help_id

          当前时间          -->              create_date                                  

          固定值              -->              reply

       说明:

         t_reply 表中,reply的值就插入固定文本"默认一个内容", create_date的值插入当前时间,其余字段和 t_help 表 对应。 

      三、实现方式

      1.SQL模板

        INSERT INTO `目标表`(各个字段)
        (
        SELECT
        各个字段 或者 固定值
        FROM
        来源表
        WHERE
        条件
        );

        说明:

        1)先按照正常写法,写目标表的插入语句。

        2)一般第一个右括号 ) 后面跟的是 values,如下所示

        INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....);

        这里后面直接跟一对括号,括号里面写查询语句即可。

        3)查询语句写来源表的查询。

        2.SQL实现

          INSERT INTO `t_reply`(help_id,problems,reply,create_date)
          (
          SELECT
              id,
              problems,
              '默认一个内容',
              NOW( )
          FROM
              t_help 
          WHERE
              1 = 1
              );

          这里,如果是固定字符串内容,直接用单引号包裹,如果是当前时间,直接用NOW() 函数即可。查询语句不加 where 1=1也可以。 

          通过执行上述语句,就完成了t_help 表到 t_reply 表数据的转移啦~

          这时,t_reply 表数据就不为空了,表数据如下图所示:

          文章转载自Java修炼记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论