You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OnConflictStrategy.REPLACE在@Insert与@Update注解下作用是否一致?

结论:两个函数执行效果完全不同
interface BaseDao<T> {
  @Insert(onConflict = OnConflictStrategy.REPLACE)
  fun insertOrReplace(data: T): Single<Long>

  @Update(onConflict = OnConflictStrategy.REPLACE)
  fun update(data: T): Single<Long>
}

核心行为差异

  • @Insert(onConflict = OnConflictStrategy.REPLACE) 行为:
    你对Insert逻辑的理解完全正确:
    • 传入实体的主键/唯一约束和表中已有记录无冲突:直接插入新记录,返回新记录的rowId
    • 传入实体的主键/唯一约束和表中已有记录冲突:删除原有冲突记录,插入新的记录,最终表现为"替换",返回新插入记录的rowId
  • @Update(onConflict = OnConflictStrategy.REPLACE) 行为:
    这个注解的核心逻辑是仅针对表中已存在的、与传入实体主键匹配的记录执行更新,和Insert逻辑有本质区别:
    • 传入实体的主键在表中不存在:不会执行任何操作,返回受影响行数为0,不会自动插入新记录
    • 传入实体的主键在表中存在:执行更新操作,这里的OnConflictStrategy.REPLACE仅在更新操作本身触发新的唯一约束冲突时生效(比如你把当前记录的唯一键字段更新为另一条已有记录的唯一键值),触发时会删除导致冲突的记录再完成当前更新,返回受影响的行数

示例场景:用户表主键为userId,当前表中不存在userId = 1001的记录

  • 调用insertOrReplace(User(userId=1001, name="张三")):会成功插入新记录,返回新记录的rowId
  • 调用update(User(userId=1001, name="张三")):没有匹配到对应主键的记录,无任何数据变更,返回0

内容的提问来源于stack exchange,提问作者ericn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:57:04