很多时候,当插入一条记录后,希望马上获得插入的主键id,
不少获得这个id的方法是 select max(id) from tablename;
为了获得这个id需要多执行一次sql语句。
PostgreSQL提供了RETURNING语句在插入后立刻获得这个id,具体方法如下:
INSERT INTO test(name) values('name') RETURNING id;
使用JDBC调用方法
String sql = "INSERT INTO test(name) VALUES (?)";
PreparedStatement pstmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
pstmt.setString(1, "name");
pstmt.executeUpdate();
ResultSet generatedKeys = pstmt.getGeneratedKeys();
if (generatedKeys.next()) {
long id = generatedKeys.getLong(1);
//logger.info("insert id :" + id);
}
使用10万条数据来测试
select max(id) 和 RETURNING 方式,测试结果如下:
select max(id)方式:72秒
RETURNING 方式:47秒
RETURNING方式的性能是select max(id)方式的1.5倍
其他数据库Derby, H2, MySQL, SQL Server也支持
conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); 方式来提高插入后获取插入id的性能。