我可以检测 '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 的文档中找到它们的语法。
有什么方法可以在 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 的文档中找到它们的语法。