数据重复插入频发?一文搞定MyBatis中ON DUPLICATE KEY的精准控制

第一章:数据重复插入的典型场景与挑战

在现代应用系统中,数据重复插入是一个常见但影响深远的问题。它不仅会导致数据库冗余、资源浪费,还可能破坏业务逻辑的一致性,特别是在金融交易、订单处理和用户注册等关键流程中。

高并发环境下的请求重试

当客户端因网络超时未收到响应而重复提交请求时,服务端若缺乏幂等性控制,极易造成同一条记录被多次写入。例如,支付接口在未完成确认的情况下被重复调用,可能导致用户被多次扣款。
  • 前端因加载无响应连续点击提交按钮
  • 网关或负载均衡器重试失败请求
  • 消息队列消费端未正确提交偏移量导致重复消费

缺乏唯一约束的设计缺陷

数据库表结构设计时忽略业务唯一键,是引发重复数据的技术主因之一。应结合业务语义设置唯一索引,如订单号、身份证号、手机号等字段组合。
场景潜在风险建议解决方案
用户注册同一手机号注册多个账号手机号唯一索引 + 注册前校验
订单创建重复下单导致库存错误订单号全局唯一 + 幂等令牌

异步任务中的状态管理缺失

在使用消息队列处理异步写入时,若未记录处理状态或未采用分布式锁,消费者重启后可能重新处理已执行的消息。
// 使用Redis实现幂等控制
func CreateOrder(orderID string, data OrderData) error {
    key := "order:created:" + orderID
    exists, _ := redisClient.SetNX(context.Background(), key, "1", time.Hour*24).Result()
    
    if !exists {
        return fmt.Errorf("order already exists")
    }
    
    // 执行订单插入逻辑
    return db.Insert(data)
}
// 说明:通过SetNX确保同一订单ID只能成功执行一次
graph TD A[客户端发起请求] --> B{是否携带幂等Token?} B -->|否| C[拒绝请求] B -->|是| D[检查Token是否已使用] D -->|已使用| E[返回已有结果] D -->|未使用| F[执行业务并标记Token]

第二章:MyBatis批量插入核心机制解析

2.1 ON DUPLICATE KEY UPDATE语义详解

在MySQL中,ON DUPLICATE KEY UPDATE用于处理插入数据时发生唯一键或主键冲突的场景。当插入的记录与现有记录的唯一约束冲突时,系统将执行更新操作而非报错。
基本语法结构
INSERT INTO table_name (id, name, count) 
VALUES (1, 'Alice', 10) 
ON DUPLICATE KEY UPDATE count = count + 10;
该语句尝试插入一条记录,若id已存在,则将原有count值增加10。其中,id必须是主键或具有唯一索引。
执行逻辑分析
  • 首先尝试执行INSERT操作;
  • 检测到重复键时,自动转为UPDATE语句;
  • 可使用VALUES()函数引用原始插入值,如VALUES(count)表示插入时指定的count值。
此机制广泛应用于计数器更新、数据去重合并等高并发写入场景,有效减少查询-判断-更新的开销。

2.2 MyBatis动态SQL与INSERT结合原理

在MyBatis中,动态SQL与INSERT语句的结合能够灵活处理不同条件下的数据插入场景。通过``、``、``等标签,可实现字段的条件性填充。
动态INSERT示例
<insert id="insertSelective" parameterType="User">
  INSERT INTO user
  <trim prefix="(" suffix=")" suffixOverrides=",">
    <if test="id != null">id,</if>
    <if test="name != null">name,</if>
    <if test="age != null">age,</if>
  </trim>
  VALUES
  <trim prefix="(" suffix=")" suffixOverrides=",">
    <if test="id != null">#{id},</if>
    <if test="name != null">#{name},</if>
    <if test="age != null">#{age},</if>
  </trim>
</insert>
该SQL片段利用``去除末尾多余的逗号,仅插入非空字段,避免数据库默认值被覆盖。
执行流程解析
  • MyBatis根据参数对象属性是否为null决定是否包含对应字段
  • SQL构建器动态生成合法的INSERT语句
  • 最终执行时由JDBC预编译传参,防止SQL注入

2.3 批量操作中的主键冲突处理策略

在执行批量插入或更新操作时,主键冲突是常见问题。若不妥善处理,可能导致整个事务回滚,影响数据一致性和系统性能。
常见处理方案
  • INSERT IGNORE:忽略冲突记录,继续执行后续插入;
  • REPLACE INTO:删除冲突行后插入新数据;
  • ON DUPLICATE KEY UPDATE:冲突时执行更新操作。
推荐实现方式
使用 ON DUPLICATE KEY UPDATE 可精细控制冲突行为:
INSERT INTO users (id, name, version) 
VALUES (1, 'Alice', 1) 
ON DUPLICATE KEY UPDATE 
name = VALUES(name), 
version = version + 1;
该语句在主键冲突时仅更新指定字段,并递增版本号,适用于幂等性要求高的场景。
性能与一致性权衡
策略性能数据安全
INSERT IGNORE高中
REPLACE INTO低低
ON DUPLICATE KEY UPDATE中高

2.4 数据库唯一索引设计对插入的影响

在数据库表设计中,唯一索引用于确保某列或组合列的数据唯一性。然而,过度使用或不当设计会显著影响插入性能。
唯一索引的检查机制
每次执行 INSERT 操作时,数据库需扫描唯一索引以确认无重复值。这一过程涉及 B+ 树的查找,时间复杂度为 O(log n),数据量大时延迟明显。
性能影响对比
场景插入耗时(10万条)
无唯一索引1.2s
单列唯一索引2.5s
联合唯一索引3.1s
优化建议
  • 避免在高频写入字段上创建唯一索引
  • 考虑使用异步校验 + 普通索引替代强唯一约束
  • 组合索引应遵循最左前缀原则,减少冗余
-- 示例:创建联合唯一索引
ALTER TABLE users ADD UNIQUE INDEX uk_email_org (email, organization_id);
该语句在 email 和 organization_id 上建立联合唯一索引,防止同一组织内邮箱重复。但每次插入均需完整匹配两字段,增加锁竞争与 I/O 开销。

2.5 实战:构建可复用的批量插入Mapper接口

在持久层开发中,频繁的手动编写批量插入逻辑会导致代码冗余。通过抽象通用Mapper接口,可大幅提升开发效率。
设计泛型批量插入接口
public interface BatchInsertMapper<T> {
    int batchInsert(@Param("list") List<T> records);
}
该接口定义了泛型方法 batchInsert,接收实体集合。结合MyBatis的<foreach>标签,可在XML中动态生成INSERT语句,适用于任意实体类型。
XML动态SQL实现
  • 使用<foreach>遍历集合,拼接VALUES子句
  • 通过@Param注解绑定参数名,确保映射正确
  • 利用数据库批处理特性提升性能

第三章:ON DUPLICATE KEY的精准控制实现

3.1 指定字段更新与忽略策略配置

在数据同步过程中,精确控制字段的更新行为是保障数据一致性的关键。通过配置指定字段更新策略,可实现仅对目标表中特定字段执行写入操作。
更新字段白名单配置
使用白名单机制可限定仅允许更新的字段列表:
{
  "update_fields": ["status", "updated_at"],
  "ignore_fields": ["created_at", "user_id"]
}
上述配置表示同步时仅更新 status 和 updated_at 字段,其余字段即使源数据存在变更也将被忽略。
忽略策略的应用场景
  • 防止关键字段(如创建时间)被意外覆盖
  • 提升同步性能,减少不必要的 I/O 操作
  • 满足审计要求,保留原始记录不变
通过组合使用更新与忽略策略,系统可在灵活性与安全性之间取得平衡。

3.2 使用表达式动态决定更新逻辑

在复杂的数据处理场景中,静态更新规则难以应对多变的业务需求。通过引入表达式引擎,可在运行时动态解析和执行更新逻辑,提升系统的灵活性。
表达式驱动的更新机制
允许将更新条件与操作封装为可执行表达式,根据上下文环境实时求值。例如,在配置化更新中,表达式可决定字段是否应被修改:
// 表达式示例:当用户等级大于3且积分未满时,增加积分
if user.Level > 3 && user.Points < 1000 {
    user.Points += 50
}
上述代码逻辑表明,仅当满足特定条件时才执行更新,避免无效写操作。
优势与应用场景
  • 支持热更新规则,无需重启服务
  • 适用于A/B测试、风控策略等动态场景
  • 结合配置中心实现集中式逻辑管理

3.3 避免误更新:条件化UPDATE的实践方案

在高并发数据操作中,误更新可能导致数据一致性严重受损。通过引入条件化UPDATE语句,可有效限制非预期的数据修改。
使用WHERE子句精确匹配更新条件
最基础且关键的做法是强化WHERE条件,确保仅目标记录被修改:
UPDATE user_balance 
SET amount = amount - 100, version = version + 1
WHERE user_id = 12345 
  AND amount >= 100 
  AND status = 'active'
  AND version = 5;
该语句不仅检查用户ID,还验证余额充足、状态合法及版本号一致。其中`version`字段用于乐观锁控制,防止并发覆盖。
结合影响行数判断执行结果
执行后需校验数据库返回的影响行数:
  • 若影响行数为0,说明未满足任何更新条件,可能是数据已变更或不存在;
  • 仅当影响行数为1时,表示更新成功。
此机制显著降低因脏读或并发写导致的逻辑错误风险。

第四章:性能优化与异常场景应对

4.1 批量提交与事务管理的最佳实践

在高并发数据处理场景中,合理使用批量提交与事务管理能显著提升系统性能和数据一致性。
批量提交的优化策略
通过合并多条SQL操作为单次批量执行,减少网络往返开销。例如,在Go语言中使用sqlx库进行批量插入:

stmt, _ := db.PrepareNamed(`INSERT INTO users(name, email) VALUES (:name, :email)`)
for _, u := range users {
    stmt.Exec(u)
}
该方式利用预编译语句提高执行效率,同时避免频繁提交导致的锁竞争。
事务粒度控制
建议将批量操作包裹在单个事务中,确保原子性:
  • 避免过小事务:增加提交开销
  • 防止过大事务:引发长时锁表或日志膨胀
合理设置commit batch size(如每1000条提交一次),平衡性能与风险。

4.2 大数据量下的内存与执行效率调优

在处理大规模数据集时,内存占用和执行效率成为系统性能的关键瓶颈。合理配置数据分片策略与缓存机制可显著降低 JVM 堆压力。
批量读取与流式处理
采用流式读取替代全量加载,避免内存溢出:

// 使用游标分批读取数据库记录
try (Cursor<Record> cursor = context.selectFrom(TABLE)
        .stream(1000)) {
    cursor.forEach(record -> process(record));
}
上述代码通过 stream(batchSize) 实现按批拉取,每批次仅加载 1000 条记录,有效控制内存峰值。
执行计划优化建议
  • 为高频查询字段建立复合索引
  • 避免 SELECT *,仅投影必要字段
  • 启用查询缓存,减少重复解析开销
结合连接池配置(如 HikariCP),可进一步提升整体吞吐能力。

4.3 唯一键冲突日志追踪与监控手段

在高并发数据写入场景中,唯一键冲突是常见异常。为实现精准追踪,需在应用层和数据库层协同记录上下文日志。
日志结构化输出
通过统一日志格式记录冲突事件,包含时间戳、SQL 语句、绑定参数及调用栈:
log.Errorw("unique key conflict",
    "table", "users",
    "field", "email",
    "value", "user@example.com",
    "trace_id", traceID)
该方式便于 ELK 栈过滤与聚合,快速定位重复字段来源。
监控与告警机制
使用 Prometheus 抓取应用暴露出的冲突计数器指标:
  • 记录每张表的冲突发生频次
  • 基于速率阈值触发告警(如 >10次/分钟)
  • 关联分布式追踪系统进行链路回溯
结合 Grafana 可视化展示趋势变化,辅助判断数据质量问题根源。

4.4 并发插入时的锁竞争问题剖析

在高并发数据库操作中,并发插入可能导致严重的锁竞争,影响系统吞吐量。当多个事务尝试向同一数据页插入记录时,InnoDB 存储引擎会使用插入意向锁(INSERT INTENTION LOCK)进行协调,但若缺乏合理索引设计,容易升级为行锁甚至页锁。
典型场景分析
例如,在无主键或聚簇索引的表中执行并发插入,可能引发间隙锁(GAP LOCK)冲突:
-- 事务1
INSERT INTO users (name) VALUES ('Alice');

-- 事务2(几乎同时)
INSERT INTO users (name) VALUES ('Bob');
上述操作可能因争夺相同索引区间而阻塞。InnoDB 会在插入前申请插入意向锁,若其他事务持有该区间的 GAP 锁,则需等待释放。
优化策略对比
策略说明效果
添加主键使用自增主键避免随机插入降低页分裂与锁冲突
批量插入合并多条 INSERT 为单语句减少锁申请次数

第五章:总结与架构层面的防重设计思考

在高并发系统中,防重设计不仅是接口层的校验问题,更应上升至架构层面进行统一治理。通过引入分布式锁与唯一索引的双重保障机制,可有效避免重复提交带来的数据污染。
幂等性保障的多层级实现
  • 接入层可通过 requestId 去重,网关拦截重复请求
  • 服务层利用 Redis 缓存请求指纹,设置合理的过期时间
  • 持久层依赖数据库唯一约束,防止脏数据写入
基于 Token 的防重流程示例

// 生成去重令牌
func GenerateToken(userID string, timestamp int64) string {
    data := fmt.Sprintf("%s-%d-%s", userID, timestamp, nonce())
    return fmt.Sprintf("token:%s", md5.Sum([]byte(data)))
}

// 校验并注册令牌(Redis SETNX)
func CheckAndLock(token string) bool {
    success, _ := redisClient.SetNX(context.Background(), token, "1", time.Minute*5).Result()
    return success
}
关键业务场景的防重策略对比
场景推荐方案失效风险
支付下单数据库唯一订单号 + Redis 指纹低
评论提交用户+内容+时间窗口去重中
抽奖操作分布式锁 + 状态机控制低
异步场景下的消息去重
在消息队列消费端,需维护已处理消息 ID 的布隆过滤器,结合数据库状态查询,避免因重试机制导致的重复执行。对于 Kafka 可启用幂等生产者,并在消费者侧添加业务主键判重逻辑。
MySQL事务深度解析:从ACID原理到Spring失效场景实战 事务是数据库保障数据一致性的核心机制,其本质是通过原子性、隔离性、持久性协同实现业务逻辑的可靠执行。理解事务需从底层原理切入:InnoDB借助WAL日志与MVCC多版本控制达成崩溃恢复与并发读写隔离;不同隔离级别(如READ COMMITTED与REPEATABLE READ)在MySQL 8.0中直接影响快照生成时机和幻读行为;而Spring的@Transactional注解因AOP代理限制,常在同类调用、私有方法或异常捕获时失效。技术价值在于规避资损与数据不一致——电商扣库存、金融转账、订单创建等典型场 阅读详情

相关推荐

大模型训练(1):流水线并行

Gpipe的方法是,在训练时计算和运用的是micro-batch里的均值和方差,但同时持续追踪全部mini-batch的移动平均和方差,以便在测试阶段进行使用。流水线并行的核心思想是:在模型并行的基础上,进一步引入数据并行的办法,即把原先的数据再划分成若干个更小的batch,分批送入GPU进行训练,算一部分就让下一个GPU动起来。从实验结果可知,在关掉NVlinks的情况下,Gpipe一样也能实现随着GPU数量的增加,训练速度也增加的效果。前文说过,随着模型的增加,每块GPU中存储的中间结果也会越大。

呆呆象呆呆的博客 1970

MySQL中的insert ignore into, replace into等的一些用法总结

MySQL replace into 有三种形式: 1. replace into tbl_name(col_name, ...) values(...) 2. replace into tbl_name(col_name, ...) select ... 3. replace into tbl_name set col_name=value, ... 1.insert i...

weixin_30654583的博客 428

Enterprise Architect 中文经典教程

本文使用到的EA工程文件下载 一、Enterprise Architect简介 Enterprise Architect是一个对于软件系统开发有着极好支持的CASE软件(Computer Aided Software Engineering)。EA不同于普通的UML画图工具(如VISIO),它将支撑系统开发的全过程。在需求分析阶段,系统分析与设计阶段,系统开发及部署等方面有着强大的支持,...

2万+

mybatis高并发情况下防止重复插入记录的方法

需求描述:一个手机号,表示一个用户,一个用户一个票id只能购买一次,但是当用户退票时,则可以再次购买,用户可以退票多次,也可以重复购买多次。目前该表主键只有id做为自增主键,如果在高并发的情况下控制插入情部,那么就需要要每次插入时,就需要先查看一下库中是否存在该用户购票记录。一般的防止重复插入记录方法,是设立主键,或者唯一主键来控制,但是如果主键和唯一主键都不能控制的情况下要如何处理呢?如果库中不在存在购买且未退的记录,则可以插入库中。time 买票时间。

大申在努力的专栏 2496

如何安装PyFluent

PyFluent 是PyAnsys生态系统的一部分, 允许您在所选的 Python 环境中结合使用 Fluent 与其他 PyAnsys 库和外部 Python 库一起使用。PyFluent 实现了客户端-服务器体系结构。它使用谷歌遥控器 过程调用或 gRPC 接口,用于启动或连接正在运行的 Fluent 进程作为服务器。但是,您只需要与 Python 交互接口。可以使用 PyFluent 以编程方式创建、交互和控制 Fluent 会话,用于创建您自己的自定义工作区。

B_etter_Man的博客 2926

PCL 中实现平面模型分割【2026最新版】

RANSAC分割平面。博客长期更新,最近一次更新时间为:2026年5月4日。

点云侠的博客 38万+

Mybatis新增数据,存在就更新,不存在就添加,Mysql避免重复插入数据的4种方式

insertignore into 即插入数据时,如果数据存在,则忽略此次插入,前提条件是插入的数据字段设置了主键或唯一索引,测试SQL语句如下,当插入本条数据时,MySQL数据库会首先检索已有数据

蓝天 1万+

R语言数据可视化:绘制世界地图的两种方案

本文介绍了两种使用R语言绘制世界地图的方案:包含边界边框和不包含边界边框。无论您选择哪种方案,使用ggplot2包和相关的地理数据包,我们可以轻松地绘制出漂亮的世界地图。R语言提供了丰富的包和函数,使我们能够轻松地绘制世界地图,并根据需求添加边界边框。在本文中,我将介绍两种绘制世界地图的方案:一种包含边界边框,一种不包含边界边框。在上述代码中,我们使用了与方案一相同的数据准备和地图绘制步骤,但省略了添加边界边框的代码。函数的调用,我们可以绘制不包含边界边框的世界地图。方案二:绘制不包含边界边框的世界地图。

CodeMaven的博客 2225

mybaits中忽略主键冲突,避免重复插入数据的三种方式

我们在进行插入数据时,如果出现主键存在的情况,单纯的insert语句显然已经无法满足要求,以下时三种避免重复插入数据的方式 方式一:ignore 插入时检索主键列表,如存在相同主键记录,不更改原记录,只插入新的记录。 INSERT IGNORE INTO test (id,name,created_time) VALUES (2,'test',now()); ignore关键字所修饰的S...

scropio0zry的博客 1万+

基于OpenClaw的AI数字员工协同团队架构设计

随着大型语言模型从被动的文本生成器向具备自主规划与执行能力的智能代理演进,企业级人工智能的应用范式正在发生根本性转变。在这一演进过程中,OpenClaw(前身为Clawdbot及Moltbot)作为一种开源的、本地优先的个人AI智能体网关基础设施,凭借其对持续内存、多通道接入以及沙盒化工具执行的原生支持,迅速成为构建“始终在线”数字劳动力的核心框架 1。然而,将单体个人助理扩展为能够处理复杂业务逻辑、支持跨组织协同并严格保障数据隔离的多智能体(Multi-Agent)团队,绝非简单的API拼接。系统架构必须

形上得其象,形下合于数;阴阳自济,玄理自明。 1048

【Android 11】使用Android Studio调试系统应用之Settings移植(三):构建Settings、SettingsLib项目文件

基于android 11,本系列文章力争实用,讲解使用AS调试系统app的方法,并提供了配套源下载,供学习调试。上一篇文章[Android 11]使用Android Studio调试系统应用(二):依赖分析、android.bp、静态和动态依赖,讲解了如何搭建编译服务器,如何下载AOSP源码,如何切换到AOSP的指定分支(android-11-r39),以及如何编译、解决编译错误、运行模拟器,本文将开始讲解如何构建Settings的AS工程文件! 走过、路过,有用过的同学,记得给个赞O(∩_∩)O哈!

上周的博客 2681

批量插入数据根据唯一键防止重复插入

Oracle+mybatis 批量插入 根据指定字段防重复数据

php321的专栏 752

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

数据库索引设计准则:精准匹配查询模式而非盲目添加

索引是数据库中用于加速数据检索的核心机制,其本质是通过B-Tree等结构建立高效的数据访问路径。理解索引需从基础原理出发:B-Tree支持范围查询与排序,Hash索引仅适用于等值匹配,全文索引专为文本分词设计——类型错配将导致‘伪优化’。技术价值在于以最小存储与写入开销,换取关键查询路径的毫秒级响应;典型应用场景包括高并发订单查询、实时报表生成及用户中心多条件筛选。实践中必须规避单列索引滥用、联合索引字段顺序错误、VARCHAR未截断等常见问题,尤其要结合实际数据分布(如选择率、过滤率)和业务语义进行逆向校

世范水晶 464

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

mybatis防重复插入(oracle数据库)

//使用mybatis标签控制是否防重复插入 ​<insert id ="insertLog"> INSERT INTO HMAOP_HEAD_CHECKIN ( ID, TELNUM, CHANNELID, SRVID, PARAMS, UPDATETIME, OPERSTATUS, STATUS, TOKEN,...

t194978的博客 2887

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

mybatis批量防止重复的insert(有重复的话,原来的值加上插入的值:MYSQL)

往mysql的表中批量插入数据,要求是:如果没有重复的记录就是正常插入数据,如果有重复的那就把这条表中原有记录的某个字段值,加上需要插入数据的对应字段值; 我这里判断数据充重不重复是根据记录中orderAccount字段来判断的,一样的表示重复,反之不重复; 这就需要在用orderAccount这个字段在当前表中建立一个联合索引,为了建立这个联合索引我在网上找了很多资料,都是 alter t...

zds12345sdfs的博客 9893

新增数据并发处理,避免重复数据插入

写在前面 项目使用SpringBoot的多实例微服务 层级调用Controller -->Service-->Dao或者Mapper(Mybatis) 具体问题和解决方案 最近在做一个模块的时候,有一个新增接口可能存在重复插入的问题 QA人为模拟两个人同时操作,具体做法是用两个手机登录同一个界面同时操作,这样就造成了重复插入, 在数据库层面,为了避免重复数据,我们可以建立唯一索引,但建立唯一索引后,程序就会抛出唯一性异常,需要捕获处理 因为是多实...

4869

Mybatis-plus框架 出现添加数据时主键冲突问题的解决办法 ASSIGN_ID出现重复值的问题

当使用Mybatis-plus的ASSIGN_ID主键生成策略时,出现两条数据id相同,导致添加不进数据库的问题,根据ASSIGN_ID生成策略原理,一毫秒的时间可以生成4096个不同主键(),实际使用上基本不可能出现重复id,但是却出现了,下面这个回答可能会解决你的问题。

f131619_0的博客 1万+

批量插入数据时防重复的实用技巧

场景 业务上经常遇到批量插入数据的场景,比如上传Excel、或者做数据同步(一次保存几十上百条记录)。保存的时候需要保证幂等性,比如订单号相同的数据不能存在多条。 简单的处理方式就是加上一个每次save前先查询下,存在则插入,否则更新或不处理该条数据。 增加某个字段的唯一索引,插入时记录中如果重复则会显式抛出MySQL的异常,需要自行处理异常。 这两种方案弊端都很明显,就是数据量小时可以接受,数据量大时速度巨慢,而且数据库的交互次数很多,占用数据库连接。 解决方案 1.使用insert ignore i

weixin_44257600的博客 4513

mybatis plus的saveOrUpdate方法重复插入数据

注意: 当你是主键自动生成的数据,一定要写UpdateWrapper,不然你必然是一直插入!完全不会更新,因为默认是用id查询的。而主键生成的数据,一般都不会去写一个id,所以就会产生数据重复插入的现象 ...

岛田悠米 6564

Excel 批量上传,mybatis在保存数据时过滤掉重复的数据

Excel 批量上传,mybatis在保存数据时过滤掉重复的数据方法总结 方法 1.过滤重复数据 <!-- 批量插入数据 --> <insert id="saveBatchToClassSchedule" parameterType="java.util.List"> Insert into XXXXXX( date, week, time_type, pitch_number,

weixin_40050628的博客 748

Mybatis之拒绝重复代码

***Provider的使用 当我们在使用Mybatis时,会发现每个类里面的方法都是重复的,比如add,update,selectById等等,我们总不至于在没个mapper里面都要这样add,update,重复的无意义工作。(假装不知道mybatis-plus). mybatis提供了一个一种可以在mapper接口方法上面定义的注解 源码中可以看到示例。然后新建接口写一些公共方法。 public interface BaseMapper<T> { @InsertProvide

weixin_42699305的博客 3086

oracle sql&mybatis 防止重复插入(实现唯一性约束)

1. luke 简介 转存失败重新上传取消 正在上传…重新上传取消 正在上传…重新上传取消 正在上传…重新上传取消 正在上传…重新上传取消 正在上传…重新上传取消 正在上传…重新上传取消 正在上传…重新上传取消 转存失败重新上传取消 转存失败重新上传取消 转存失败重新上传取消 正在上传…重新上传取消 正在上传…重新上传取消 转存失败重新上传取消 luke### 是一个用于Lu...

lgq2016的博客 2991

mysql 批量插入数据如何防止重复插入

mysql批量插入数据时,会存在重复数据的可能. 可以通过1)数据库加联合索引 2)修改sql,忽略重复的数据,防止数据库报错 1. CREATE TABLE `merchantBlackList` ( `id` int(5) NOT NULL AUTO_INCREMENT, `createTime` datetime NOT NULL, `bankId` int(10) DEFAULT NULL COMMENT '银行id', `merchantSn` varchar(20) COLLA

hit、run 3275
上一篇: BigDecimal除法舍入模式选择困难?这5种场景对应方案必须收藏
下一篇: 【Spring Boot多环境配置终极指南】:掌握7种激活方式,告别环境切换难题
InitFlow
博客等级 码龄1年 145粉丝 2166原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值