在 MySQL 中使用 Insert Into Select

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 【8月更文挑战第11天】

在 MySQL 中,INSERT INTO ... SELECT 语句是一个强大的数据操作工具,用于将数据从一个表插入到另一个表中。这个语句允许在不直接指定插入值的情况下,通过从查询结果中选择数据来完成插入操作。本文将详细介绍 INSERT INTO ... SELECT 的用法,包括基本语法、示例操作、应用场景和注意事项。

1. 基本概念

1.1 INSERT INTO ... SELECT 语法

INSERT INTO ... SELECT 语句可以从一个表(或多个表)中选择数据并将其插入到目标表中。其基本语法如下:

INSERT INTO target_table (column1, column2, ...)
SELECT value1, value2, ...
FROM source_table
WHERE condition;
  • target_table:目标表,数据将插入到这个表中。
  • column1, column2, ...:目标表中的列名,必须与 SELECT 查询中的列数和顺序匹配。
  • source_table:源表,从中选择数据。
  • value1, value2, ...:从源表中选择的数据列。
  • condition:可选的条件,用于过滤要插入的数据。

2. 示例操作

2.1 基本示例

假设有两个表:employeesnew_employeesemployees 表存储了现有员工的信息,而 new_employees 表用于存储从其他来源导入的新员工数据。

创建表的示例:

CREATE TABLE employees (
    employee_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    position VARCHAR(50)
);

CREATE TABLE new_employees (
    employee_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    position VARCHAR(50)
);

插入数据到 new_employees 表:

INSERT INTO new_employees (name, position)
VALUES ('John Doe', 'Developer'), ('Jane Smith', 'Designer');

new_employees 中的数据插入到 employees 表:

INSERT INTO employees (name, position)
SELECT name, position
FROM new_employees;

在这个示例中,INSERT INTO employees 语句将 new_employees 表中的所有记录插入到 employees 表中。

2.2 从多个表中选择数据

可以从多个表中选择数据并将其插入到目标表中。例如,从 employees 表和 contractors 表中选择数据,并将其插入到 staff 表中:

创建表的示例:

CREATE TABLE contractors (
    contractor_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    role VARCHAR(50)
);

CREATE TABLE staff (
    staff_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    role VARCHAR(50)
);

插入数据到 contractors 表:

INSERT INTO contractors (name, role)
VALUES ('Emily Davis', 'Consultant'), ('Michael Brown', 'Freelancer');

employeescontractors 表的数据插入到 staff 表:

INSERT INTO staff (name, role)
SELECT name, position
FROM employees
UNION ALL
SELECT name, role
FROM contractors;

在这个示例中,UNION ALL 将两个 SELECT 查询的结果合并为一个结果集,然后将其插入到 staff 表中。

3. 常见应用场景

3.1 数据迁移

INSERT INTO ... SELECT 可以用于数据迁移,例如将数据从一个数据库表迁移到另一个数据库表。迁移操作可以涉及不同的表结构、数据格式或数据库实例。

示例:

INSERT INTO new_database.employees (name, position)
SELECT name, position
FROM old_database.employees;

3.2 数据汇总

在数据分析过程中,可以使用 INSERT INTO ... SELECT 来汇总数据。例如,将来自多个表的统计信息插入到一个汇总表中:

示例:

INSERT INTO summary_report (department, total_employees)
SELECT department, COUNT(*)
FROM employees
GROUP BY department;

3.3 数据备份

INSERT INTO ... SELECT 可以用于数据备份,将数据从主表复制到备份表中:

示例:

INSERT INTO backup_employees (employee_id, name, position)
SELECT employee_id, name, position
FROM employees;

4. 注意事项

4.1 列的匹配

确保 INSERT INTO 语句中的列名与 SELECT 查询中的列顺序和数据类型匹配。如果列名和数据类型不匹配,可能会导致插入失败或数据不正确。

示例:

-- 错误的示例:列数和数据类型不匹配
INSERT INTO employees (name, position)
SELECT name, employee_id  -- 错误,`employee_id` 与目标表不匹配
FROM new_employees;

4.2 性能考虑

对于大型数据集,INSERT INTO ... SELECT 可能会影响性能。可以考虑使用批量插入、索引优化和事务控制来提高性能。

优化性能的建议:

  • 批量插入:将数据分批插入,以减少锁定和事务日志的开销。
  • 索引优化:在插入前禁用或删除索引,插入后重新创建索引。
  • 事务控制:将多个插入操作封装在一个事务中,以减少事务开销。

4.3 事务处理

在执行 INSERT INTO ... SELECT 语句时,可以使用事务控制来确保数据的一致性。例如,可以使用 START TRANSACTIONCOMMIT 来确保操作的原子性:

START TRANSACTION;

INSERT INTO employees (name, position)
SELECT name, position
FROM new_employees;

COMMIT;

如果在事务中发生错误,可以使用 ROLLBACK 来撤销操作:

START TRANSACTION;

INSERT INTO employees (name, position)
SELECT name, position
FROM new_employees;

-- 假设此处发生了错误
ROLLBACK;

5. 总结

INSERT INTO ... SELECT 是 MySQL 中一个非常实用的数据操作语句,允许将数据从一个表插入到另一个表中。通过使用 INSERT INTO ... SELECT,可以实现数据迁移、汇总和备份等操作。在实际应用中,需要确保列的匹配、考虑性能和使用事务控制。掌握这些技术可以帮助您更高效地管理 MySQL 数据库中的数据。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
存储 自然语言处理 关系型数据库
MySQL全文索引源码剖析之Insert语句执行过程
【8月更文挑战第17天】在MySQL中,处理含全文索引的`INSERT`语句涉及多步骤。首先进行语法解析确认语句结构无误;接着语义分析检查数据是否符合表结构及约束。随后存储引擎执行插入操作,若涉及全文索引则进行分词处理,并更新倒排索引结构。此外,事务管理确保了操作的完整性和一致性。通过示例创建含全文索引的表并插入数据,可见MySQL如何高效地处理此类操作,有助于优化数据库性能和提升全文搜索效果。
|
2月前
|
关系型数据库 MySQL
解决MySQL insert出现Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘xxx‘ at row 1
解决MySQL insert出现Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘xxx‘ at row 1
149 2
|
3月前
|
存储 关系型数据库 文件存储
面试题MySQL问题之简单的SELECT操作在MVCC下加锁如何解决
面试题MySQL问题之简单的SELECT操作在MVCC下加锁如何解决
43 2
|
3月前
|
关系型数据库 MySQL 索引
MySQL之优化SELECT语句
以上只是一些基本的优化策略,具体的优化方案还需要根据实际的业务需求和数据情况来定制。
43 0
|
4月前
|
关系型数据库 MySQL 数据库
MySQL SELECT查询实战:练习题精选,提升你的数据库查询技能
MySQL SELECT查询实战:练习题精选,提升你的数据库查询技能
|
4月前
|
SQL 关系型数据库 MySQL
深入探索MySQL SELECT查询:从基础到高级,解锁数据宝藏的密钥
深入探索MySQL SELECT查询:从基础到高级,解锁数据宝藏的密钥
|
9天前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
43 6
|
7天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
39 3
Mysql(4)—数据库索引
|
9天前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
27 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
14天前
|
缓存 算法 关系型数据库
Mysql(3)—数据库相关概念及工作原理
数据库是一个以某种有组织的方式存储的数据集合。它通常包括一个或多个不同的主题领域或用途的数据表。
38 5
Mysql(3)—数据库相关概念及工作原理