关于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));
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 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】