在 MySQL 中使用 Insert Into Select的示例操作

 更新时间:2025年06月13日 09:22:57   作者:wljslmz  
本文将详细介绍 INSERT INTO ... SELECT 的用法,包括基本语法、示例操作、应用场景和注意事项,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

在 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 中使用 Insert Into Select的文章就介绍到这了,更多相关mysql使用 Insert Into Select内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL三表联合查询操作举例

    MySQL三表联合查询操作举例

    在mysql查询语句中,为了实现查询到某些信息,我们会用到多表的联合查询,下面这篇文章主要给大家介绍了关于MySQL三表联合查询操作的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • win10安装zip版MySQL8.0.19的教程详解

    win10安装zip版MySQL8.0.19的教程详解

    这篇文章主要介绍了win10安装zip版MySQL8.0.19的教程详细,本文分步骤给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • mysql下为数据库设置交叉权限的方法

    mysql下为数据库设置交叉权限的方法

    由于 SupeSite 需要调用 Discuz! 和 UCHome 的数据,所以如果它们不安装在同一个数据库,SupeSite 的数据库用户必须要对 Discuz! 和 UCHome 的数据库有读取、修改、删除等权限。
    2011-07-07
  • mysql查询条件not in 和 in的区别及原因说明

    mysql查询条件not in 和 in的区别及原因说明

    这篇文章主要介绍了mysql查询条件not in 和 in的区别及原因说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • 解决MySQL Workbench gnome-keyring-daemon错误的方法分享

    解决MySQL Workbench gnome-keyring-daemon错误的方法分享

    这篇文章主要介绍了解决MySQL Workbench gnome-keyring-daemon错误的方法,需要的朋友可以参考下
    2014-08-08
  • MySQL8.0 Command Line Client输入密码后出现闪退现象的原因以及解决方法总结

    MySQL8.0 Command Line Client输入密码后出现闪退现象的原因以及解决方法总结

    我们在安装MYSQL数据库时,经常会出现一些问题,下面这篇文章主要给大家介绍了关于MySQL8.0 Command Line Client输入密码后出现闪退现象的原因以及解决方法的相关资料,需要的朋友可以参考下
    2023-03-03
  • 教你如何6秒钟往MySQL插入100万条数据的实现

    教你如何6秒钟往MySQL插入100万条数据的实现

    这篇文章主要介绍了教你如何6秒钟往MySQL插入100万条数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • MySQL主从复制问题总结及排查过程

    MySQL主从复制问题总结及排查过程

    这篇文章主要介绍了MySQL主从复制问题总结及排查过程,mysql主从是常用的高可用架构之一,也是使用最广泛的的系统架构。在生产环境中mysql主从复制有时会出现复制错误问题。下文更多内容需要的小伙伴可以参考一下
    2022-03-03
  • MySQL的join buffer原理

    MySQL的join buffer原理

    这篇文章主要介绍了MySQL的join buffer原理,帮助大家更好的理解和学习使用MySQL数据库,感兴趣的朋友可以了解下
    2021-04-04
  • Ubuntu上安装MySQL+问题处理+安全优化

    Ubuntu上安装MySQL+问题处理+安全优化

    这篇文章主要汇总介绍了Ubuntu上安装MySQL+问题处理+安全优化的相关事项,非常的细致全面,有需要的小伙伴可以参考下
    2016-03-03

最新评论