首页
学习
活动
专区
圈层
工具
发布

mysql 批量一对多插入

基础概念

MySQL 批量一对多插入是指在一个事务中,将多个主表记录和对应的多个子表记录一次性插入数据库。这种操作通常用于提高数据插入的效率,尤其是在处理大量数据时。

相关优势

  1. 提高效率:批量插入可以减少网络传输和数据库操作的次数,从而显著提高数据插入的速度。
  2. 减少锁竞争:通过事务控制,可以减少对数据库表的锁竞争,提高并发性能。
  3. 简化代码:批量插入可以简化代码逻辑,减少循环插入的复杂度。

类型

  1. 使用 INSERT INTO ... SELECT 语句:适用于从一个表中选择数据并插入到另一个表中。
  2. 使用 INSERT INTO ... VALUES 语句:适用于直接插入多组数据。

应用场景

  1. 数据迁移:将一个数据库的数据迁移到另一个数据库。
  2. 批量导入数据:从文件或其他数据源批量导入数据到数据库。
  3. 日志记录:记录大量日志数据时,批量插入可以显著提高效率。

示例代码

假设我们有两个表:usersorders,其中 users 是主表,orders 是子表,它们之间是一对多的关系。

代码语言:txt
复制
-- 创建 users 表
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL
);

-- 创建 orders 表
CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    product VARCHAR(255) NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

-- 批量插入数据
START TRANSACTION;

INSERT INTO users (name) VALUES
('Alice'),
('Bob'),
('Charlie');

INSERT INTO orders (user_id, product) VALUES
(1, 'Product A'),
(1, 'Product B'),
(2, 'Product C'),
(3, 'Product D');

COMMIT;

遇到的问题及解决方法

问题:批量插入时遇到 Duplicate entry 错误

原因:插入的数据中存在重复的主键或唯一键值。

解决方法

  1. 检查数据:确保插入的数据中没有重复的主键或唯一键值。
  2. 使用 INSERT IGNOREREPLACE INTO
代码语言:txt
复制
INSERT IGNORE INTO users (name) VALUES ('Alice'), ('Bob');

或者

代码语言:txt
复制
REPLACE INTO users (id, name) VALUES (1, 'Alice'), (2, 'Bob');

问题:批量插入时遇到 Deadlock found when trying to get lock 错误

原因:多个事务相互等待对方释放锁,导致死锁。

解决方法

  1. 优化事务:尽量减少事务的范围,缩短事务的持有时间。
  2. 调整事务隔离级别:根据业务需求调整事务隔离级别,减少锁的竞争。

问题:批量插入时性能不佳

原因:可能是由于网络传输、数据库配置或硬件性能限制。

解决方法

  1. 优化 SQL 语句:确保 SQL 语句高效,避免不必要的复杂操作。
  2. 调整数据库配置:增加缓冲区大小,优化连接数等配置。
  3. 使用批量插入工具:如 LOAD DATA INFILE 或第三方工具。

参考链接

希望这些信息对你有所帮助!如果有更多问题,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • MySQL 批量插入:如何不插入重复数据?

    知识这个东西,看来真的要温故而知新,一直不用,都要忘记了 业务很简单:需要批量插入一些数据,数据来源可能是其他数据库的表,也可能是一个外部excel的导入 那么问题来了,是不是每次插入之前都要查一遍...向大数据数据库中插入值时,还要判断插入是否重复,然后插入。如何提高效率 看来这个问题不止我一个人苦恼过。...user (name) SELECT 'telami' FROM dual WHERE NOT EXISTS (SELECT id FROM user WHERE id = 1) 这种方法其实就是使用了mysql...item.username}, #{item.mobileNumber} ) ON duplicate KEY UPDATE id = id 这里用的是Mybatis,批量插入的一个操作...这样在批量插入时,如果存在手机号相同的话,是不会再插入了的。 来源:www.telami.cn

    5.4K20

    Mysql批量插入分析【面试+工作】

    前言 最近发现几个项目中都有批次插入数据库的功能,每个项目中批次插入的写法有一些差别,所以本文打算对Mysql的批次插入做一个详细的分析。...准备 1.jdk1.7,mysql5.6.38 2.准备库和表 ? 测试与分析 下面准备几种插入的方式来分析优劣: 1.Statement插入方式 ?...准备数据,然后通过Statement方式插入数据,插入10000条数据大概在6秒多左右,同时可以监控服务器数据包; 监控命令: ? 日志如下: ?...同样插入10000条数据,时间大概在5秒多左右,比起Statement有一定优势,但是不明显;PreparedStatement使用的是批次提交,速度不应该这么查,同样观察日志: ?...此方式可以很好的执行批量数据的插入,但是如果数据量很大,一下执行所有数据的批次插入,很容易造成客户端内存的溢出,所以也可以使用第三种方式; 3.PreparedStatement分批次方式 部分代码如下

    2.3K20

    Mysql批量插入时,如何不插入重复的数据

    业务很简单:需要批量插入一些数据,数据来源可能是其他数据库的表,也可能是一个外部excel的导入 那么问题来了,是不是每次插入之前都要查一遍,看看重不重复,在代码里筛选一下数据,重复的就过滤掉呢?...向大数据数据库中插入值时,还要判断插入是否重复,然后插入。如何提高效率 看来这个问题不止我一个人苦恼过。...user (name) SELECT 'telami' FROM dual WHERE NOT EXISTS (SELECT id FROM user WHERE id = 1) 这种方法其实就是使用了mysql...item.mobileNumber} ) ON duplicate KEY UPDATE id = id 这里用的是Mybatis,批量插入的一个操作...这样在批量插入时,如果存在手机号相同的话,是不会再插入了的。

    6.7K21

    【MySQL】插入优化篇——(少量插入数据优化&批量插入数据load指令)

    前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎!...本章主要内容面向接触过C++ Linux的老铁 主要内容含: 1.批量插入 采取以下形式,在一个insert语句中完成数据插入,而不是分成几个insert语句 Insert into tb test...values(1,'Tom'),(2,'cat'),(3, jerry'); 【1】需要大批量插入数据——load指令 如果一次性需要插入大批量数据,使用insert语句插入性能较低,此时可以使用MVSQL...本地磁盘文件中的数据,通过load直接加载到数据库表结构中 操作如下: #客户端连接服务端时,加上参数--local-infile mysql --local-infile -u root -p #设置全局参数...批量处理:对于大量的插入操作,将它们封装在一个事务中可以显著提高性能,因为数据库只需在事务结束时进行一次磁盘写入操作,而不是每次插入都写入。

    2.1K10

    Mybatis批量插入与存储过程批量插入

    前言在数据库操作中,批量插入是一个常见的性能优化手段,特别是在需要插入大量数据时。Mybatis作为一款优秀的持久层框架,提供了多种批量插入数据的方式。...除了传统的Mybatis映射文件中的批量插入外,还可以利用存储过程来实现批量插入。本文就来讲解一下Mybatis常用的几种批量插入方式,以及重点介绍存储过程插入。1....Mybatis传统批量插入Mybatis中可以通过在Mapper XML文件中编写批量插入的SQL语句,并在Java代码中通过List或数组的形式传递参数来实现批量插入。...这种方式需要确保SQL语句支持批量插入,并且需要在Mybatis的配置文件中启用批量操作。...使用存储过程进行批量插入可以减少与数据库的交互次数,提高性能。在上面的示例中,你已经展示了如何使用存储过程来批量插入数据。

    1.9K10

    面试官:MySQL 批量插入,如何不插入重复数据?

    业务很简单:需要批量插入一些数据,数据来源可能是其他数据库的表,也可能是一个外部excel的导入。 那么问题来了,是不是每次插入之前都要查一遍,看看重不重复,在代码里筛选一下数据,重复的就过滤掉呢?...向大数据数据库中插入值时,还要判断插入是否重复,然后插入。 如何提高效率? 看来这个问题不止我一个人苦恼过。...user (name) SELECT 'telami' FROM dual WHERE NOT EXISTS (SELECT id FROM user WHERE id = 1) 这种方法其实就是使用了MySQL...item.mobileNumber} ) ON duplicate KEY UPDATE id = id 这里用的是Mybatis,批量插入的一个操作...这样在批量插入时,如果存在手机号相同的话,是不会再插入了的。 —END—

    2K20

    MySQL批量插入测试数据的几种方式

    在开发过程中我们不管是用来测试性能还是在生产环境中页面展示好看一点, 又或者学习验证某一知识点经常需要一些测试数据, 这个时候如果手敲的话, 十行二十行还好, 多了就很死亡了, 接下来介绍两种常用的MySQL...测试数据批量生成方式 存储方式+函数 Navicat的数据生成 一、表 准备了两张表 角色表: id: 自增长 role_name: 随机字符串, 不允许重复 orders: 1-1000任意数字...NULL COMMENT '排序权重\r\n', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 二、使用函数生成 通过存储过程快速插入..., 通过函数保证数据不重复 设置允许创建函数 查看 MySQL是否允许创建函数 SHOW VARIABLES LIKE 'log_bin_trust_function_creators'; 结果如图所示...-- 插入用户数据 DELIMITER $$ CREATE PROCEDURE insert_user(START INT, max_num INT) BEGIN DECLARE i INT

    1.1K10

    使用shell脚本批量插入数据到MySQL中

    经常会踫到这样的场景需求:批量向MySQL数据库插入数据,显然手工INSERT成千上万条数据是不现实的,所以自己写了这个shell脚本来处理。...1 具体需求 shell脚本批量插入10万条数据到MySQL中,其中对应表唯一索引是用户uid。因此在程序循环1万次数时,每次都使uid自增1就行了。...2 脚本代码 鉴于数据量比较大,我们的shell脚本需要考虑MySQL执行INSERT的效率,所以采用了对次数取模拼接多个VALUES的值来实现。.../bin/bash # FileName: batchinsertmysqlshell1.sh # Description: 使用shell脚本批量插入数据到MySQL中 # Simple.../batchinsertmysqlshell1.sh # mysql db name. db_name="gamedata" # mysql table name. table_name="test_user_skin

    2.8K10
    领券