前言
有时候,我们往往有这种需求:需要把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表的所有数据;