我在这样的重复更新方法上插入,我使用mariadb 10.1.14:
public <R extends Record> void batchUpsertRecord(Table<R> table, List<R> records) throws PersistenceException {
Connection conn = ConnectionPoolManager.INSTANCE.getConnection();
try (DSLContext dslContext = DSL.using(conn, SQLDialect.MARIADB)) {
List<InsertQuery> insertQueryList = new ArrayList<>();
for (R record : records) {
InsertQuery<R> insert = dslContext.insertQuery(table);
insert.addRecord(record);
insert.onDuplicateKeyUpdate(true);
insert.addValuesForUpdate(mapOfChangedValues(record));
insertQueryList.add(insert);
}
dslContext.batch(insertQueryList).execute();
conn.commit();
} catch (SQLException e) {
logger.error("Failed to upsert record into table({}).", table.getName(), e);
} finally {
ConnectionPoolManager.INSTANCE.closeConnection(conn, logger);
}
}
如果记录已经存在,它会随机(很少)起作用,如果删除现有记录,则插入始终有效。
从日志中我可以看到sql每次都成功执行,但是即使记录已经存在,大多数时候受影响的行也是1(在更新情况下,它应该是2)。
似乎更新并不总是有效但插入确实有效。如果我手动执行生成的sql,它的工作正常。
对这种情况真的很困惑。在此先感谢您的帮助!