【发布时间】:2016-04-16 12:52:18
【问题描述】:
我们正在使用 Derby,并且有很多这样的代码:
try (ResultSet rs = executeQuery(...)) {
if (rs.next()) {
updateRowSet(rs, ...);
rs.updateRow();
} else {
executeUpdate(...);
}
}
过去,我们正在寻找一种在服务器端执行此逻辑的方法,发现某些数据库支持“upsert”(更新或插入)操作。 Derby 有一个对MERGE INTO 的功能请求,这应该是 SQL:2003 标准的执行方式,所以我们坐下来看着票,很长一段时间过去了。
Derby 10.11 终于添加了MERGE INTO。还没有人有时间检查并更新代码以使用它,但是在阅读他们的文档时,他们的所有示例都显示从一个表合并到另一个表。但是等一下,我们的数据还没有在表格中!
我知道我可以将它放在一个表中,但是它又是多个查询,这完全违背了使用它的意义。
我确定可以在不将其放入表格的情况下做到这一点,但由于文档没有显示单个示例,我不确定如何继续。
这是我一直在尝试的:
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();
}
这似乎没有做任何插入,但也没有给出错误,所以我完全没有什么可继续的。
【问题讨论】:
-
我认为德比不可能做到这一点。它不允许常量值作为合并语句的“源”。
标签: java sql jdbc derby upsert