如果数据库中已存在数据则更新或跳过,如果数据库中不存在则insert
最后更新:2024-03-19 10:43:44
|
状态:未完成
在批量操作时,经常需要实现如果数据库中已存在数据则更新或跳过,如果数据库中不存在则insert的效果。
这需要数据库特性支持,同时一般还会要求有唯一索引,
主要通过ConfigStore.override实现
如:service.insert(tab, row, new DefaultConfigStore().override(Boolean.TRUE,"CODE","TYPE"));
或者.override(Boolean.TRUE,"唯一索引")
true:表示数据重复时覆盖,code,type表示判断重复的依据,code,type一般会要求在唯一索引中,也有的数据库不支持指定列名,
实现原理参考【Postgres】【MySQL】【Oracle】【Apache Ignite】
如果不支持的话,则会分两步,1.通过一次查询检测数据是否存在。2.执行insert或update并且是逐行执行,所以很慢。
在索引不满足的情况下
或者数据库不支持时按以下操作
//DataSet DataRow规则一样 DataRow row = service.query("CRM_USER"); //默认情况下 有主键值则update 没主键值则insert service.save(row); //如果设置了override属性值,在执行SQL前会先检查数据库 //如果数据已存存则覆盖 row.override(true); service.save(row); //如果数据已存存则跳过 row.override(false); service.save(row); //复合主键规则一样 row.setPrimaryKey("CODE","NAME"); //默认情况下 有主键值则update 没主键值则insert row.override(null); service.save(row); //如果数据已存存则覆盖 row.override(true); service.save(row); //如果数据已存存则跳过 row.override(false); service.save(row);