我们正在使用 Derby 并且有很多代码,如下所示:
try (ResultSet rs = executeQuery(...)) {
if (rs.next()) {
updateRowSet(rs, ...);
rs.updateRow();
} else {
executeUpdate(...);
}
}
过去,我们正在寻找一种在服务器端执行此逻辑的方法,并发现某些数据库支持“upsert”(更新或插入)操作。德比有一个功能请求MERGE INTO
这被认为是执行此操作的 SQL:2003 标准方法,因此我们坐下来观看票证,很长一段时间过去了。
德比10.11终于添加了MERGE INTO。还没有人有时间仔细阅读并更新代码来使用它,但是在阅读他们的文档时,他们的所有示例都显示了从一个表合并到另一个表的情况。但是等一下,我们的数据还没有在表中!
我知道我可以put它在一个表中,但随后又是多个查询,这完全失去了使用它的意义。
我确信可以做到without将其放入表格中,但由于文档没有显示单个示例,因此我不确定如何继续。
这是我一直在尝试的:
try (PreparedStatement ps = connection.prepareStatement(
"MERGE INTO things AS target " +
// Awkward point 1:
// It wants a "source" table, but I don't have one.
// So I thought I would try to use the same table with
// another name.
" USING things AS source ON target.id = ?" +
" WHEN MATCHED THEN" +
" UPDATE SET data = ?" +
" WHEN NOT MATCHED THEN" +
" INSERT (id, data) VALUES (??, ?)"))
{
ps.setLong(1, id);
ps.setBinaryStream(2, data);
ps.setLong(3, id);
// Awkward point 2:
// Passing an InputStream into a query as two
// parameters.
ps.setBinaryStream(4, data);
ps.execute();
}
这似乎没有执行任何插入,但也没有给出错误,所以我绝对没有什么可继续的。