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

     

前言

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

### 如何在Navicat中将一个数据导入一个 #### 方法一:通过SQL语句实现数据迁移 对于较为简单的场景,可以直接编写 SQL 语句来完成从源到目标数据转移工作。假设存在两个结构相同或相似的格 `source_table` 和 `target_table` ,可以执行如下命令: ```sql INSERT INTO target_table (column1, column2, ...) SELECT column1, column2, ... FROM source_table; ``` 此方法适用于 MySQL 数据库环境,在其他类型的数据库产品上也基本通用[^3]。 #### 方法二:利用Navicat内置功能——“复制” Navicat 提供了一个直观易用的功能叫做 “复制”,它允许用户轻松地把某个现有中的全部记录迁移到另外一个新创建出来的空白里去。具体操作流程如下所示: - 打开 Navicat 并连接至相应的数据库实例; - 展开左侧的对象浏览器找到待处理的目标数据库名称并展开其下的各个对象节点直到定位到具体的源名; - 右键点击该项选择菜单里的 "Copy Table..." 功能入口进入下一步设置页面; - 在弹出对话框内指定好目的位置以及是否保留原有索引/约束条件等细节选项之后按下 OK 键确认提交任务即可启动整个过程[^1]; #### 方法三:借助CSV作为中介载体 当面对不同平台之间的异构型数据库间传输需求时,则可以通过先导出成 CSV 文件再重新加载的方式间接达成跨系统交换的目的。例如,如果要将 Oracle 中名为 EMP 的员工信息列同步给 PostgreSQL 使用的话就可以按照下面步骤来进行转换作业: - 首先确保已经安装配置好了支持多类型数据库访问权限认证机制的服务端程序版本号较高的 Navicat 工具集; - 接着依照常规方式登录对应厂商提供的关系型数据库管理系统控制台界面; - 定位到想要抽取出来做进一步加工改造的那个原始业务逻辑单元即 EMP 格实体资源之上右击调用快捷菜单选取其中有关于 “Export Wizard...” 出口链接触发向导引导模式下的一系列交互提示逐步完善各项参数直至最终获得一份符合预期格式要求的标准纯文本文件 emp.csv [^2]; - 将上述得到的结果保存下来传送到接收方服务器所在主机设备当中准备就绪等待后续动作的发生; - 登录PostgreSQL客户端工具,选择合适的方案空间后再次运用类似的图形化辅助手段快速便捷地完成批量录入更新事务性变更请求从而使得新的存储介质内部能够容纳先前所携带过来的信息副本.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值