前言

     有时候,我们往往有这种需求:需要把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 表数据就不为空了,表数据如下图所示:

附:

将1个表的数据整表备份:

SELECT * INTO student_bak_20230414 FROM student;

这样,就能够将student 这张表的数据,全量备份到 student_bak_20230414表了,

实现过程是新建一张表:student_bak_20230414,然后插入student表的所有数据;

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐