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

IGNORE,REPLACE,ON DUPLICATE KEY UPDATE在避免重复插入记录时存在的问题及最佳实践

在实际业务场景中,经常会有这样的需求:插入一条记录,如果数据表中已经存在该条记录则更新它的部分字段,比如更新update_time或者在某些列上执行累加操作等。...由此可知,在实际生产环境中,几乎不太有使用该关键字的场景,因为业务上是需要当出现唯一键冲突时更新某些字段的,而不是直接忽略。...; 当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时,从表中删除含有重复关键字值的(所有)冲突行 ; 再次尝试把新行插入到表中 。...其中和record1是在A键上冲突,和record2是在B键上冲突,那么Innodb最终只会返回这两条重复记录中的一条,并最终更新返回的这条记录。而且更重要的是,到底返回哪一条是不确定的。...此外,参考博客中提到,MySQL在指定主键(id )进行插入的时候,如果这个id大于表的自增值,那么MySQL会把表的自增值修改为这个id值并加1,但是如果我们把主键更新成更大的值,MySQL并不会把表的自增值修改为更新后的值

2.6K23

Mybatis使用generatedKey在插入数据时返回自增id始终为1,自增id实际返回到原对象当中的问题排查

今天在使用数据库的时候,遇到一个场景,即在插入数据完成后需要返回此数据对应的自增主键id,但是在使用Mybatis中的generatedKey且确认各项配置均正确无误的情况下,每次插入成功后,返回的都是...1,而不是最新的自增Id。...终于凭借着一次Debugg发现的问题,原来在使用Mabatis中的insert或者insertSelective方式插入时,如使用int insert(TestGenKey testGenKey)时,返回值...int表示的是插入操作受影响的行数,而不是指的自增长id,那么返回的自增id到底去哪里了呢?...null : sex.trim(); } } 测试及Debugg 编写测试方法测试插入 插入成功后观察对应的变量对应的值 总结:调用Insert后插入操作之后,所得到自增长Id被赋值到原对象当中

2.1K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Spring Boot 接口幂等性实现的 4 种方案!

    使用数据库唯一主键完成幂等性时需要注意的是,该主键一般来说并不是使用数据库中自增主键,而是使用分布式 ID 充当主键(可以参考 Java 中分布式 ID 的设计方案 这篇文章),这样才能能保证在分布式环境下...② 服务端执行业务逻辑,生成一个分布式 ID,将该 ID 充当待插入数据的主键,然后执数据插入操作,运行对应的 SQL 语句。 ③ 服务端将该条数据插入数据库中,如果插入成功则表示没有重复调用接口。...1600 为了每次执行更新时防止重复更新,确定更新的一定是要更新的内容,我们通常都会添加一个 version 字段记录当前的记录版本,这样在更新时候将该值带上,那么只要执行更新操作就能确定一定更新的是某个对应版本下的信息...方案四、下游传递唯一序列号 方案描述: 所谓请求序列号,其实就是每次向服务端请求时候附带一个短时间内唯一不重复的序列号,该序列号可以是一个有序 ID,也可以是一个订单号,一般由下游生成,在调用上游服务端接口时附加该序列号和用于认证的...令牌 插入操作 更新操作 删除操作 适中 - 需要 Redis 第三方存储生成的 Token 串;

    6.2K21

    Spring Boot 实现接口幂等性的 4 种方案

    使用数据库唯一主键完成幂等性时需要注意的是,该主键一般来说并不是使用数据库中自增主键,而是使用分布式 ID 充当主键(可以参考 Java 中分布式 ID 的设计方案 这篇文章),这样才能能保证在分布式环境下...② 服务端执行业务逻辑,生成一个分布式 ID,将该 ID 充当待插入数据的主键,然后执数据插入操作,运行对应的 SQL 语句。③ 服务端将该条数据插入数据库中,如果插入成功则表示没有重复调用接口。...方案四、下游传递唯一序列号 方案描述:所谓请求序列号,其实就是每次向服务端请求时候附带一个短时间内唯一不重复的序列号,该序列号可以是一个有序 ID,也可以是一个订单号,一般由下游生成,在调用上游服务端接口时附加该序列号和用于认证的...适用操作:插入操作更新操作删除操作使用限制:要求第三方传递唯一序列号;需要使用第三方组件 Redis 进行数据效验;主要流程: 主要步骤: ① 下游服务生成分布式 ID 作为序列号,然后执行请求调用上游接口...;请求序列号插入操作 更新操作 删除操作简单- 需要保证下游生成唯一序列号;- 需要 Redis 第三方存储已经请求的序列号;防重 Token 令牌插入操作 更新操作 删除操作适中- 需要 Redis

    42110

    SpringBoot 实现接口幂等性的 4 种方案!

    使用数据库唯一主键完成幂等性时需要注意的是,该主键一般来说并不是使用数据库中自增主键,而是使用分布式 ID 充当主键(可以参考 Java 中分布式 ID 的设计方案 这篇文章),这样才能能保证在分布式环境下...② 服务端执行业务逻辑,生成一个分布式 ID,将该 ID 充当待插入数据的主键,然后执数据插入操作,运行对应的 SQL 语句。 ③ 服务端将该条数据插入数据库中,如果插入成功则表示没有重复调用接口。...1600 为了每次执行更新时防止重复更新,确定更新的一定是要更新的内容,我们通常都会添加一个 version 字段记录当前的记录版本,这样在更新时候将该值带上,那么只要执行更新操作就能确定一定更新的是某个对应版本下的信息...方案四、下游传递唯一序列号 方案描述: 所谓请求序列号,其实就是每次向服务端请求时候附带一个短时间内唯一不重复的序列号,该序列号可以是一个有序 ID,也可以是一个订单号,一般由下游生成,在调用上游服务端接口时附加该序列号和用于认证的...适用操作: 插入操作 更新操作 删除操作 使用限制: 要求第三方传递唯一序列号; 需要使用第三方组件 Redis 进行数据效验; 主要流程: 主要步骤: ① 下游服务生成分布式 ID 作为序列号,然后执行请求调用上游接口

    75411

    MyBatis快速上手增删改查

    引言-絮絮叨叨 作为一个快乐的小码农,在每一个阶段往往都在重复写着不同版本的,学生管理,用户管理,注册登录,从 JavaSE 的控制台版,或者 GUI 版,再到 JavaWeb的 JSP版,再到纯粹使用...,读取配置文件,生产 SqlSession,释放资源等等,在每一测试方法的时候,都是重复的,所以我们完全可以提出出这一部分,防止大量的重复代码 @Before public void init...添加一个 parameterType 属性,其中需要指定这个实体类 2、在文本中书写插入的SQL语句,由于实体类中已经快捷生成了对应的 get set 方法,所一可以使用 #{}的方式代表对应的值 3...、提示,数据库中id为自增,所以并不需要设置 id (3) 注意: 由于添加是更新类的语句,所以在执行插入语句后,需要提交事务,也就是执行对应的 commit方法,以提交更新操作,若没有这一句,即使不会报错...(6) 获取新增用户的id值 首先对于 MySQL自增主键来说,在执行 insert语句之前,MySQL 会自动生成一个自增主键,insert执行后,通过 SELECT LAST_INSERT_ID(

    53820

    你用过不写代码就能完成一个简单模块的组件么?

    ◆ 开篇四连问 ◆ 你是否懒得写普通的增删改查方法? 你是否不喜欢代码生成插件的重复代码? 你是否渴望一个没有冗余代码的项目? 你是否渴望一行代码都不用写就能完成一个简单的模块?...等到参加工作的时候就觉得没什么大不了的了,直接copy后进行修改。工作一段时间以后觉得自己写太累了然后就开始使用代码生成插件。...以后开发时我只维护这一个组件,把剩余的精力放到业务代码上呢? 3 ◆ 我封装的什么组件?..."); IdField idField=new IdField(); idField.setMap(map); return idField; } 有的项目在进行插入和更新时会加入创建人和修改人等信息..."); map.put("updateUserName", "修改人名称"); return map; } } 更新扩展 插入扩展 还有没有更灵活的使用方式?

    38000

    分布式id实现方案,选leaf吗?

    1.2 分布式ID需要满足的条件 全局唯一:不能出现重复ID; 高性能、高可用:生成ID速度快,接近于100%的可用,不会成为业务瓶颈; 趋势递增:由于大多数数据库使用B-tree按索引有序存储数据,主键...2.2 数据库自增ID 用一个专门的表生成自增ID,提供给其他表使用。以MySQL为例,创建下面的这张表,当需要一个ID时,向表中插入一条记录返回主键id即可。...时,先发起查询,然后更新max_id,更新成功则表示获取到新号段[max_id, max_id+step)。...如果L固定不变,QPS增长时,T会越来越小,即更新库表越来越频繁,且DB故障时缓存的号段能够支撑服务正常运行的时间更短了。...3.2.2 应对时钟回拨 启动时检查 在Leaf实例启动后,会隔3秒更新zookeeper节点数据,上报当前服务器时间。该时间将被用于Leaf启动时,与机器本地时间进行比较。

    43410

    【工作篇】接口幂等问题探究

    工作篇】接口幂等问题探究 前言 最近遇到一些问题,表单重复提交,导致插入重复数据到数据库,这里查询一些通用的方案,自己都实践一下,以后好回顾。...导致这个情况会有以下几种场景: 前端重复提交:提交订单,用户快速重复点击多次,造成后端生成多个内容重复的订单。...、Zookeeper 注意要保证中间件的高可用 Token 机制: 进入页面时先申请 Token,提交表单时再使用 Token 请求,后台根据 Token 判断是否重复请求 前端申请 Token 和...; 3.4、使用 Token 机制 操作步骤 1、在访问页面时,先获取 Token ,保持到指定的地方 2、在点击加入购物车时,把 Token 放到 Header 或请求参数中,带给后台 3、后台验证...,但实际业务可能比较个性化,需要跟业务结合进行考虑,采用合适的方法或结合使用,例如: 如果该业务是存在状态流转,可以采用状态机策略进行业务幂等判断 如果该业务是更新数据,可以采用多版本策略,在需要更新的业务表上加上版本号

    77500

    【Node】sequelize 使用对象的方式操作数据库

    /sequelize-auto 这个库帮我们自动生成model,它直接拉取数据库表的信息,然后生成对应的model 2、定义设置器(get,set) 有的数据出库入库的时候,需要做一些额外的处理,这时就适合放到...可以避免创建重复的数据,直接插入数据 如果数据不存在,就插入,如果存在,就更新 怎么判定这个数据是否存在?...通过主键或者 唯一索引 比如表中已经存在 id 为 1 的数据,此时你再插入 id 为1 的数据,那么就只会进行更新,不会再插入 下面介绍几个添加的场景 1、限定插入的字段 2、限定更新的字段 3、关联表创建...,只插入 name 和 sex fields: ['name', 'sex'], }, ); 限定更新的字段 如果插入重复的数据 触发更新操作的时候,我们可以限定更新的字段,比如通过 createUser...` (`id`,`name`) VALUES (NULL,'new—2'); // 因为我设置了name 为唯一索引,所以当我插入第二条同名数据时,就会报错,然后就开始回退,连同前一条数据被回滚 Executing

    9K20

    【愚公系列】2023年02月 .NET CORE工具案例-Dapper-Extensions的使用

    文章目录 前言 一、Dapper-Extensions的使用 1.安装包 2.使用方法 2.1 插入数据 2.2 获取单个实体 2.3 删除记录 2.4 更新记录 2.5 获取记录列表 2.6 根据自动排序...CRUD 操作(获取、插入、更新、删除)来补充 Dapper。...自动映射用于获取、插入、更新和删除操作的 POCO。 获取列表,计数方法适用于更高级的方案。 用于返回分页结果集的 GetPage。 自动支持 Guid 和整数主键(包括对其他键类型的手动支持)。...在生成的 SQL 中正确转义表/列名称(例如:从 [用户] WHERE [用户] 中选择 [名字]。...DateCreated { get; set; } } 2.1 插入数据 using (SqlConnection cn = new SqlConnection(_connectionString))

    1.2K30

    接口幂等性

    2、数据库乐观锁 这种方法适合在更新的场景中, update t_goods set count = count -1 , version = version + 1 where good_id=2 and...获取到锁的必须先判断 这个数据是否被处理过。 3、各种唯一约束 1、数据库唯一约束 插入数据,应该按照唯一索引进行插入,比如订单号,相同的订单就不可能有两条记录插入。我们在数据库层面防止重复。...这个机制是利用了数据库的主键唯一约束的特性,解决了在 insert 场景时幂等问题。但主键 的要求不是自增的主键,这样就需要业务生成全局唯一的主键。...4、防重表 使用订单号 orderNo 做为去重表的唯一索引,把唯一索引插入去重表,再进行业务操作,且他们在同一个事务中。这个保证了重复请求时,因为去重表有唯一约束,导致请求失败,避免了幂等问题。...之前说的 redis 防重也算 5、全局请求唯一 id 调用接口时,生成一个唯一 id,redis 将数据保存到集合中(去重),存在即处理过。

    28830

    面试官:你们是如何保证接口的幂等性?

    使用数据库唯一主键完成幂等性时需要注意的是,该主键一般来说并不是使用数据库中自增主键,而是使用分布式 ID 充当主键,这样才能能保证在分布式环境下 ID 的全局唯一性。...② 服务端执行业务逻辑,生成一个分布式 ID,将该 ID 充当待插入数据的主键,然后执数据插入操作,运行对应的 SQL 语句。 ③ 服务端将该条数据插入数据库中,如果插入成功则表示没有重复调用接口。...1600 为了每次执行更新时防止重复更新,确定更新的一定是要更新的内容,我们通常都会添加一个 version 字段记录当前的记录版本,这样在更新时候将该值带上,那么只要执行更新操作就能确定一定更新的是某个对应版本下的信息...方案四、下游传递唯一序列号 方案描述: 所谓请求序列号,其实就是每次向服务端请求时候附带一个短时间内唯一不重复的序列号,该序列号可以是一个有序 ID,也可以是一个订单号,一般由下游生成,在调用上游服务端接口时附加该序列号和用于认证的...适用操作: 插入操作 更新操作 删除操作 使用限制: 要求第三方传递唯一序列号; 需要使用第三方组件 Redis 进行数据效验; 主要流程: ① 下游服务生成分布式 ID 作为序列号,然后执行请求调用上游接口

    1.7K41

    Spring Data JDBC - 如何使用自定义 ID 生成

    原标题:Spring认证|Spring Data JDBC-如何使用自定义ID生成 这是关于如何解决使用 Spring Data JDBC 时可能遇到的各种挑战的系列文章的第一篇。...文章基于我在 2021 年春季一期上这篇文章的部分演讲。 使用 ID - 特别是当您想要控制实体的 ID 并且不会选择什么数据库时,您的选择是什么。...假设情况下,类型数据列JDBC假设的ID通过生成SERIAL或AUTOINCREMENT得到。 ,聚合根执行插入操作。数据库生成一个ID,这个ID由Spring Data JDBC在聚合根中设置。...它返回修改潜在的聚合根,因此它也适用于不形成实体类。 在目标中,我们确定有问题的聚合根是否需要新 ID。 如果是这样,我们将使用我们选择的算法生成它。...reloaded = stringions.findById(before.id).get(); assertThat(reloaded.name).isEqualTo("Kevin"); 持久的 一个选项是让化根控制是否应该更新或插入

    1.8K20

    一口气说出四种幂等性解决方案,面试官露出了姨母笑~

    在接口调用时一般情况下都能正常返回信息不会重复提交,不过在遇见以下情况时可以就会出现问题,如: 前端重复提交表单: 在填写一些表格时候,用户填写完成提交,很多时候会因网络波动没有及时对用户做出提交成功响应...使用数据库唯一主键完成幂等性时需要注意的是,该主键一般来说并不是使用数据库中自增主键,而是使用分布式 ID 充当主键,这样才能能保证在分布式环境下 ID 的全局唯一性。...服务端执行业务逻辑,生成一个分布式 ID,将该 ID 充当待插入数据的主键,然 后执数据插入操作,运行对应的 SQL 语句。 服务端将该条数据插入数据库中,如果插入成功则表示没有重复调用接口。...为了每次执行更新时防止重复更新,确定更新的一定是要更新的内容,我们通常都会添加一个 version 字段记录当前的记录版本,这样在更新时候将该值带上,那么只要执行更新操作就能确定一定更新的是某个对应版本下的信息...所谓请求序列号,其实就是每次向服务端请求时候附带一个短时间内唯一不重复的序列号,该序列号可以是一个有序 ID,也可以是一个订单号,一般由下游生成,在调用上游服务端接口时附加该序列号和用于认证的 ID。

    2K41

    分布式系统ID生成方案汇总

    在分布式系统中,需要对大量的数据、消息、请求等进行唯一的标识,例如分布式数据库的ID需要满足唯一且多数据库同步,在单一系统中,使用数据库自增主键可以满足需求,但是在分布式系统中就需要一个能够生成全局唯一...编号从1开始,并以1为基数递增; 把0插入auto_increment数据列的效果与插入NULL值一样,但是不建议这样做,还是以插入NULL值为好; 当插入记录时,没有为auto_increment...明确指定值,则等同于插入NULL值; 当插入记录时,如果为auto_increment数据列明确指定了一个数值,则会出现两种情况,情况一,如果插入的值与已有的编号重复,则会出现出错信息,因为auto_increment...也即可以跳过一些编号; 如果用update命令更新自增列,如果列值与已有的值重复,则会出错。如果大于已有值,则下一个编号从该值开始递增。...这样才可以避免多台服务器更新时自增长字段的值之间出现冲突。

    1.2K20

    用 Python 优雅地玩转 Elasticsearch:实用技巧与最佳实践

    如果提供了doc_id,该ID将用于文档;否则,Elasticsearch会自动生成一个ID。...这些操作涵盖了创建和删除索引、定义映射、插入、更新和删除文档以及基本的搜索功能。...如果提供了id,将使用它作为文档ID;否则,Elasticsearch会自动生成一个。...这种设计使得在大多数情况下,我们只需在应用启动时建立一次连接,而不需要在每个查询中重复指定连接信息,从而简化了代码并提高了代码的可读性和维护性。...此外,我们还介绍了如何通过elasticsearch-dsl内部管理的默认连接池来简化连接管理,避免了在每次查询时重复指定连接信息,从而提高了开发效率和代码的可维护性。

    7.2K10
    领券