如果数据库中已存在数据则更新或跳过,如果数据库中不存在则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);
最近更新 搜索 提交