我可以检测 'merge into' H2 语句是否在内部使用插入或更新吗?

Can I detect if a 'merge into' H2 statement was using insert or update internally?

有什么方法可以在 Java 中检测到 H2 merge into 语句执行的是插入而不是更新?

在这两种情况下,结果都是受影响的行数,但我需要知道记录是否已经存在并更新或刚刚创建。

对于我想要 return 204 而不是 201 - 已创建的 Rest 服务,结果很有趣。

是的,有:

Connection c = DriverManager.getConnection("jdbc:h2:mem:1")) {
Statement s = c.createStatement();
s.execute("CREATE TABLE TEST(ID INT PRIMARY KEY, V INT)");
PreparedStatement ps = c.prepareStatement(
    "SELECT ID FROM OLD TABLE (MERGE INTO TEST(ID, V) KEY(ID) VALUES (?, ?))");
ResultSet rs;
ps.setInt(1, 1);
ps.setInt(2, 10);
rs = ps.executeQuery();
System.out.println(rs.next() ? "UPDATE" : "INSERT");
ps.setInt(1, 1);
ps.setInt(2, 20);
rs = ps.executeQuery();
System.out.println(rs.next() ? "UPDATE" : "INSERT");

但是,您需要最新版本的 H2,因为历史版本不支持数据更改增量表。

在示例代码中,为了简单起见,我使用了 MERGE 命令的非标准和不可移植的变体。您可以使用它或它的标准兼容版本,您可以在 H2 的文档中找到它们的语法。