关于PostgreSQL的ON CONFLICT,如果存在重复数据 覆盖或忽略

最后更新:2024-05-13 05:30:00 | 状态:未完成
当执行 INSERT 操作时,如果数据表中不存在对应的记录,执行插入操作;如果数据表中存在对应的记录,则执行更新操作

是否存在可以根据 1.指定列判断 或者2 唯一约束名


Table table = service.metadata().table("CRM_USER");
if(null != table){
	service.ddl().drop(table);
}
table = new Table("CRM_USER");
table.addColumn("ID", "GIBINT").setPrimaryKey(true).setAutoIncrement(true);
table.addColumn("CODE", "VARCHAR(10)");
table.addColumn("NAME","VARCHAR(10)");
service.ddl().create(table);
//唯一索引
Constraint u_code = new Constraint<>(table, "u_code", true).addColumn("CODE");
service.ddl().add(u_code);

DataSet set = new DataSet();
for(int i=0; i<10; i++){
	DataRow row = new DataRow();
	row.put("CODE", "C"+i);
	row.put("NAME", "张三"+i);
	set.add(row);
}
service.insert("CRM_USER", set);
set = new DataSet();
for(int i=0; i<3; i++){
	DataRow row = new DataRow();
	row.put("CODE", "C"+i);
	row.put("NAME", "王五"+i);
	set.add(row);
}
//根据CODE判断 重复则覆盖
ConfigStore configs = new DefaultConfigStore();
configs.override(true, "CODE");
service.insert("CRM_USER", set, configs);
set = new DataSet();
for(int i=3; i<6; i++){
	DataRow row = new DataRow();
	row.put("CODE", "C"+i);
	row.put("NAME", "赵六"+i);
	set.add(row);
}
//根据唯一索引判断 重复则覆盖
configs.override(true, u_code);
service.insert("CRM_USER", set, configs);
set = new DataSet();
for(int i=6; i<9; i++){
	DataRow row = new DataRow();
	row.put("CODE", "C"+i);
	row.put("NAME", "不覆盖"+i);
	set.add(row);
}
//根据唯一索引判断 重复则忽略
configs.override(false, u_code);
service.insert("CRM_USER", set, configs);


MySQL也提供了类似的功能(只是mysql是根据唯一约束来判断是否重复)
参考【MySQL的insert ignore into和replace into
Apache ignite也提供了类似的功能(根据主键)
参考【Apache ignite MERGE
首页 最近更新 搜索 提交 回复