Mysql批量插入数据时该如何解决重复问题详解
作者:头秃的程序员小王 发布时间:2024-01-20 16:18:41
前言
当数据库中存量数据较多时,或者是在批量插入操作时,很容易出现插入重复数据的问题。
一、三种方法
在 mysql 中,当存在主键冲突或唯一键冲突的情况下,根据插入策略不同,一般有以下三种避免方法:
insert ignore into:若没有则插入,若存在则忽略
replace into:若没有则正常插入,若存在则先删除后插入
insert into ... on duplicate key update:若没有则正常插入,若存在则更新
注意,使用以上方法的前提是表中有一个 PRIMARY KEY 或 UNIQUE 约束/索引,否则,使用以上三个语句没有特殊意义,与使用单纯的 INSERT INTO 效果相同。
测试表结构:
测试表数据:
二、细节
2.1、insert ignore into
insert ignore 会根据主键或者唯一键判断,忽略数据库中已经存在的数据,若数据库没有该条数据,就插入为新的数据,跟普通的 insert into 一样。若数据库有该条数据,就忽略这条插入语句,不执行插入操作。
insert ignore into student(age) values (12),(13);
age=12的数据已存在,因此未插入(根据创建时间可得),age=13的数据不存在,因此成功插入
2.2 、insert into ... on duplicate key update
在 insert into 语句末尾指定 on duplicate key update,会根据主键或者唯一键判断:若数据库有该条数据,则直接更新原数据,相当于 update,若数据库没有该条数据,则插入为新的数据,跟普通的 insert into 一样。
insert into student(age) values (12),(13)
ON DUPLICATE KEY UPDATE student.created_at = '2022-01-01 00:00:00';
age=12的记录已存在,因此created_at字段被更新。age=13的记录不存在,因此成功插入
2.3、replace into
replace into student(age) values (12),(13);
age=12的记录已存在,因此被删除重新插入(由createdAt值可知)。age=13的记录不存在,因此成功插入
replace into 会根据主键或者唯一键判断:
若表中已存在该数据,则先删除此行数据,然后插入新的数据,相当于 delete + insert
可能会丢失数据、主从服务器的 AUTO_INCREMENT 不一致。
若表中不存在该数据,则直接插入新数据,跟普通的 insert into 一样
三、总结
1)在主键冲突情况下,三种方法都可以使用
2)在唯一键冲突情况下,且有自增主键时:三种方法都会出现 AUTO_INCREMENT 不连续问题,且这种不连续不会同步更新到 slave 的 AUTO_INCREMENT。当 master 被 kill,且 slave 升级为 master 时,就会出现主键冲突问题。(因为事务原因,即使没有插入成功,也会占用一个自增id。row模式binlog下,主从的数据同步是一致的,主键也一致。有没有影响取决于主从同步模式)
statement格式:binlog记录的是实际执行的sql语句
row格式:binlog记录的是变化前后的数据(涉及所有列),形如update table_a set col1=value1, col2=value2 ... where col1=condition1 and col2=condition2 ...
mixed格式:默认选择statement格式,只在需要时改用row格式
3)replace into 方法可能会导致部分数据丢失。
来源:https://blog.csdn.net/qq_39326472/article/details/127760044


猜你喜欢
- 当点了链接后,跳出的网页地址是https://www.aspxhome.com/ 或https://www.cidianwang.
- 我就废话不多说了,大家还是直接看代码吧~print({1, 2} > {1}) # True补充:Python——集合是一个非常之牛逼
- PyQt的文本操作的继承关系:QTextBrowser ( QtGui.QTextEdit)其中QTextEdit具有的功能函数:copy(
- 这篇文章主要介绍了Python实现word2Vec model过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
- 伴随着自然语言技术和机器学习技术的发展,越来越多的有意思的自然语言小项目呈现在大家的眼前,聊天机器人就是其中最典型的应用,今天小编就带领大家
- 1、pd.cut函数有7个参数,主要用于对数据从最大值到最小值进行等距划分 pandas.cut(x, bins,&nb
- 遇到mysql ERROR 1045 这个问题搞了很久,自己记下来。方法是百度的,亲测有效。ERROR 1045 (28000): Acce
- 引言使用 python 绘制网络训练过程中的的 loss 曲线以及准确率变化曲线,这里的主要思想就时先把想要的损失值以及准确率值保存下来,保
- 1.导入依赖包import ( "github.com/spf13/viper")2.编写ya
- 使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(100000),如何提高效率呢?在JDBC编程接口中State
- 先给大家介绍下Python读取文件夹按数字排序的代码,内容如下所示:python中 os.listdir()方法用于返回指定的文件夹包含的文
- 前言Vux 是基于 Vue 和 Weui 开发的手机端页面 UI 组件库,开发初衷是满足公司的微信端表单需求,因为第三方的调查问卷表单系统在
- 本文实例讲述了Python机器学习之scikit-learn库中KNN算法的封装与使用方法。分享给大家供大家参考,具体如下:1、工具准备,p
- lambda函数lambda是什么大家好,今天给大家带来的是有关于Python里面的lambda表达式详细解析。lambda在Python里
- 假设我们已经安装好了tensorflow。一般在安装好tensorflow后,都会跑它的demo,而最常见的demo就是手写数字识别的dem
- 正则表达式的定义在编写处理字符串的程时,经常会遇到在一段文本中查找符合某些规则的字符串的需求,正则表达式就是用于描述这些规则的工具,换句话说
- 本次爬虫思路最最重要的是分析信息接口!!!1. 获取url2. 通过请求拿到响应3. 处理反爬4. 提取信息5. 保存内容本次操练网页htt
- 一 方法汇总在 Python 进程中,有几种方法可以实现数据交互:共享内存:这是一种用于进程间通信的高效方式。多个进程可以访问同一个共享内存
- 问题最近,在用SSH框架完成一个实践项目时,碰到了一个莫名其妙的Bug困扰了我好久,最后终于解决,记录如下。问题:同学在测试系统的时候突然发
- 所见即所得的文本编辑器目前在网上流传的已经有很多了,并且都比较优秀,就我个人而言,用过的有以下几个: ·