关于MySQL的insert ignore into和replace into
最后更新:2024-05-12 05:30:00
|
状态:未完成
务必注意,如果执行了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】