我有一个连接到postgreSQL数据库的服务器,我想在插入后将新行的ID返回给客户端。我试过了:
int id = stmt.execute("insert into [table] values(default,0) returning id;");
SQL语句工作,如果我直接在数据库上工作,但不在这里,我得到这个错误:org.postgresql.util.PSQLException:当没有预期结果时返回结果。
我认为这是因为execute()和executeUpdate()不应该返回值,所以我添加了这个:
stmt.execute("insert into [table] values(default,0) returning id;");
ResultSet id = stmt.executeQuery("select last_insert_id();");
显然,该语句是mySQL,所以它不起作用,我读过CURRVAL和NEXTVAL在postgreSQL中这样做,但我没能做到这一点,我也读过它并不总是准确的。
是我遗漏了什么,还是有其他的方法?
您可以使用getGeneratedKeys()
String sql = "insert into the_table(some_column) values (?)";
PreparedStatement pstmt = connection.prepareStatement(sql, new String[]{"id"});
pstmt.setInt(1, 0);
int numRows = pstmt.executeUpdate();
ResultSet keys = pstmt.getGeneratedKeys();
int newId = -1;
if (keys.next()) {
newId = keys.getInt(1);
}
或者你也可以使用:
PreparedStatement pstmt = connection.prepareStatement("...", PreparedStatement.RETURN_GENERATED_KEYS);
这也适用于batchedStatements(在pstmt.executeBatch()
之后)或多行插入。在这种情况下,if (keys.next())
必须更改为while()
循环,以遍历所有生成的id