首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql 批量插入去重

基础概念

MySQL 批量插入去重是指在向 MySQL 数据库中插入多条记录时,确保这些记录中的某些字段(通常是主键或唯一索引字段)不会重复。这样可以避免因重复数据导致的各种问题,如数据不一致、查询效率低下等。

相关优势

  1. 提高数据质量:确保数据的唯一性和准确性。
  2. 提升性能:通过减少插入操作中的重复检查,可以提高插入效率。
  3. 简化逻辑:在应用层减少去重逻辑,使代码更简洁。

类型

  1. 使用 INSERT IGNORE 语句:当插入的数据与表中的某些行冲突时,会忽略这些冲突的行。
  2. 使用 ON DUPLICATE KEY UPDATE 语句:当插入的数据与表中的某些行冲突时,会更新这些冲突的行。
  3. 先查询再插入:在插入前先查询表中是否已存在相同的数据,如果不存在则插入。

应用场景

  1. 用户注册系统:确保每个用户的用户名或邮箱是唯一的。
  2. 商品管理系统:确保商品编号或名称的唯一性。
  3. 订单管理系统:确保订单号或其他关键信息的唯一性。

示例代码

假设我们有一个用户表 users,其中 email 字段是唯一的。

使用 INSERT IGNORE

代码语言:txt
复制
INSERT IGNORE INTO users (name, email)
VALUES ('Alice', 'alice@example.com'),
       ('Bob', 'bob@example.com'),
       ('Charlie', 'alice@example.com'); -- 这行会被忽略,因为 email 已经存在

使用 ON DUPLICATE KEY UPDATE

代码语言:txt
复制
INSERT INTO users (name, email)
VALUES ('Alice', 'alice@example.com'),
       ('Bob', 'bob@example.com'),
       ('Charlie', 'alice@example.com')
ON DUPLICATE KEY UPDATE name = VALUES(name);

在这个例子中,如果 email 已经存在,那么 name 字段会被更新为新的值。

遇到的问题及解决方法

问题:插入速度慢

原因:可能是由于大量的插入操作导致数据库性能下降。

解决方法

  1. 批量插入:将多个插入操作合并为一个批量插入操作。
  2. 优化索引:确保表的索引设计合理,避免过多的索引影响插入性能。
  3. 使用事务:将多个插入操作放在一个事务中,减少事务开销。

问题:数据重复

原因:可能是由于插入的数据本身就包含重复项,或者插入逻辑没有正确处理去重。

解决方法

  1. 预处理数据:在插入前对数据进行去重处理。
  2. 使用 INSERT IGNOREON DUPLICATE KEY UPDATE:如上所述,利用 SQL 语句的特性进行去重。
  3. 检查业务逻辑:确保业务逻辑中没有引入重复数据。

参考链接

通过以上方法,可以有效地在 MySQL 中进行批量插入并去重,确保数据的唯一性和准确性。

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

相关·内容

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

    前言 最近发现几个项目中都有批次插入数据库的功能,每个项目中批次插入的写法有一些差别,所以本文打算对Mysql的批次插入做一个详细的分析。...准备 1.jdk1.7,mysql5.6.38 2.准备库和表 ? 测试与分析 下面准备几种插入的方式来分析优劣: 1.Statement插入方式 ?...此方法计算每次提交批量数据中的多少条数据,其中一个maxAllowedPacket参数,此参数在服务器端配置用来限制客户端每个包的最大字节数; 查询maxAllowedPacket: ?...此方式可以很好的执行批量数据的插入,但是如果数据量很大,一下执行所有数据的批次插入,很容易造成客户端内存的溢出,所以也可以使用第三种方式; 3.PreparedStatement分批次方式 部分代码如下...总结 本文通过三种方式来插入数据,从而了解Mysql批次插入的过程,了解到useLocalSessionState和rewriteBatchedStatements参数对性能的影响,以及maxAllowedPacket

    1.9K20

    MySql批量插入语句(INSERT)

    使用INSERT语句实现批量插入 前言 在初始化数据库或者导入一些数据时,常常会用到批量的操作,如果在循环的脚本中使用单条插入数据的语句时,就意味着多次与数据库建立连接,这样会急剧消耗服务器的性能。...那么,MySql是提供了批量插入语句的,和单条插入语句类似。...单条插入语句写法 INSERT INTO [表名] ([列名],[列名]) VALUES([列值],[列值]); 批量插入语句写法 INSERT INTO [表名]([列名],[列名]) VALUES...([列值],[列值])), ([列值],[列值])), ([列值],[列值])); 由此看来两者很相似,批量插入语句则是在前者的值后面继续添加新的值,并用逗号分隔。...NULL, `sex` VARCHAR(16), PRIMARY KEY ( `id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8; 查看结果 批量插入记录

    9.8K20

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

    知识这个东西,看来真的要温故而知新,一直不用,都要忘记了 业务很简单:需要批量插入一些数据,数据来源可能是其他数据库的表,也可能是一个外部excel的导入 那么问题来了,是不是每次插入之前都要查一遍...几百万的数据,不可能查出来,做处理 说一下我Google到的解决方案 1、insert ignore into 当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。...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

    3.6K20

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

    业务很简单:需要批量插入一些数据,数据来源可能是其他数据库的表,也可能是一个外部excel的导入 那么问题来了,是不是每次插入之前都要查一遍,看看重不重复,在代码里筛选一下数据,重复的就过滤掉呢?...几百万的数据,不可能查出来,做处理 说一下我Google到的解决方案? 1、insert ignore into 当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。...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,批量插入的一个操作...这样在批量插入时,如果存在手机号相同的话,是不会再插入了的。

    5.3K21

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

    业务很简单:需要批量插入一些数据,数据来源可能是其他数据库的表,也可能是一个外部excel的导入 那么问题来了,是不是每次插入之前都要查一遍,看看重不重复,在代码里筛选一下数据,重复的就过滤掉呢?...几百万的数据,不可能查出来,做处理 说一下我Google到的解决方案 1、insert ignore into 当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。...item.mobileNumber} ) ON duplicate KEY UPDATE id = id 这里用的是Mybatis,批量插入的一个操作...这样在批量插入时,如果存在手机号相同的话,是不会再插入了的。...来源:http://www.telami.cn/2018/when-mysql-batch-inserts-and-how-to-not-insert-duplicate-data/

    2.8K20

    mysql批量插入大量数据「建议收藏」

    mysql批量插入大量数据 时间:2020年11月25日 今天遇到了一个批量插入大量数据任务,然后出于小白本能,直接for-each循环插入不就好了,于是手上开始噼里啪啦一顿操作,写好了从读取excel...1w条数据进行比较 1w条数据插入了11s,比上面不知道快了多少,可是这样插入是有一个弊端的,就是数据量再大一点的话,会报错的,我改成10w跑一下给你们看一下效果 ### Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException...你也可以修改mysql的配置文件解决,但是生产上有时候自己身不由己,所以求人不如求自己,自己再想想办法。...以上版本的驱动,才能实现高性能的批量插入。...MySQL JDBC驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,批量插入实际上是单条插入,直接造成较低的性能。

    3.8K10

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

    来源:http://www.telami.cn/2018/when-mysql-batch-inserts-and-how-to-not-insert-duplicate-data/ 温故而知新 业务很简单...:需要批量插入一些数据,数据来源可能是其他数据库的表,也可能是一个外部excel的导入 那么问题来了,是不是每次插入之前都要查一遍,看看重不重复,在代码里筛选一下数据,重复的就过滤掉呢?...几百万的数据,不可能查出来,做处理 说一下我Google到的解决方案 1、insert ignore into 当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。...item.mobileNumber} ) ON duplicate KEY UPDATE id = id 这里用的是Mybatis,批量插入的一个操作...这样在批量插入时,如果存在手机号相同的话,是不会再插入了的。

    3.5K20
    领券