关于MySQL的insert ignore into和replace into

最后更新:2023-11-15 05:30:21 | 状态:未完成

务必注意,如果执行了replace into会把原数据删除,重新插入新数据,如果有自增主键的话,主键值会变化。
 //override=true : replace into
//override=false: insert ignore into
ServiceProxy.insert("CRM_USER", row, new DefaultConfigStore().override(Boolean.FALSE));
public static void override() throws Exception{
	String tab = "tab_override";
	Table table = service.metadata().table(tab);
	if(null != table){
		service.ddl().drop(table);
	}
	table = new Table(tab);
	table.addColumn("ID", "BIGINT").setAutoIncrement(true);
	table.addColumn("CODE1", "varchar(10)");
	table.addColumn("CODE2", "varchar(10)");
	table.addColumn("CODE3", "varchar(10)");
	table.addColumn("QTY", "INT");

	service.ddl().create(table);
	Index index = new Index<>();
	index.setUnique(true);
	index.addColumn("CODE1");
	index.addColumn("CODE2");
	index.addColumn("CODE3");
	index.setTable("tab_override");
	service.ddl().add(index);
	DataRow row = new DataRow();
	row.put("CODE1", 1);
	row.put("CODE2", 2);
	row.put("CODE3", 3);
	row.put("QTY", 100);
	service.insert(tab, row);
	row = new DataRow();
	row.put("CODE1", 1);
	row.put("CODE2", 2);
	row.put("CODE3", 3);
	row.put("QTY", 200);
	//不覆盖,重复数量忽略 影响行数0
	service.insert(tab, row, new DefaultConfigStore().override(Boolean.FALSE));
	DataSet set = service.querys(tab);
	System.out.println(set);


	row = new DataRow();
	row.put("CODE1", 1);
	row.put("CODE2", 2);
	row.put("CODE3", 3);
	row.put("QTY", 300);
	//覆盖,重复数量更新 影响行数2 原来的id:1,qty:100被删除 插入id:3, qty:300
	//注意这里执行的是delete+insert 而不是update 所以影响2行
	service.insert(tab, row, new DefaultConfigStore().override(Boolean.TRUE));
	set = service.querys(tab);
	System.out.println(set);
}

PG也提供了类似的功能,可以根据唯一约束 也可以根据指定列来判断重复,参考【关于PostgreSQL的ON CONFLICT
Apache ignite也提供了类似的功能(根据主键)参考【Apache ignite MERGE
最近更新 搜索 提交