gpt4 book ai didi

java - 我可以使用 MERGE INTO 在 Apache Derby 中模拟 "upsert"吗?

转载 作者:搜寻专家 更新时间:2023-11-01 02:40:21 25 4
gpt4 key购买 nike

我们正在使用 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();
}

这似乎没有进行任何插入,但也没有给出错误,所以我绝对没有什么可以继续的。

最佳答案

为所有仍在使用 derby 的悲伤的人分享它:)所以我在 merge into statement( https://db.apache.org/derby/docs/10.14/ref/rrefsqljmerge.html ) 的帮助下解决了这个问题:

MERGE INTO foo
USING SYSIBM.SYSDUMMY1
ON foo.id = '1' AND foo.language = 'en'
WHEN MATCHED THEN
UPDATE SET name = 'name2', image = 'someImgUrl2'
WHEN NOT MATCHED THEN
INSERT (id, name, language, image)
VALUES ('1', 'name1', 'en', 'someImgUrl1')

其中 foo 是您要插入行的表和 SYSIBM.SYSDUMMY1 只有 1 个无用行的 derby 虚拟表(顺便说一句,它不适用于我的一个有多个行的常规表行)

正如您可能理解的那样,它更像是一种变通方法,但总比没有实现更新插入目标要好。

关于java - 我可以使用 MERGE INTO 在 Apache Derby 中模拟 "upsert"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34734653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com