Java 插入一行后如何获取序列id?

Java 插入一行后如何获取序列id?,java,hibernate,postgresql,Java,Hibernate,Postgresql,我有一个表,在PostgreSQL中,行“id”(主键)默认设置为serial。我通过调用 session.getCurrentSession().createSQLQuery("some insert query") 不向id中添加任何值,因为它默认设置为串行 如何检索刚刚插入的行的“id”?因为它是串行的,所以您可以使用从tableName中选择max(id) Using max(id) is a very bad idea. It will not give you the

我有一个表,在PostgreSQL中,行“id”(主键)默认设置为serial。我通过调用

session.getCurrentSession().createSQLQuery("some insert query") 
不向id中添加任何值,因为它默认设置为串行


如何检索刚刚插入的行的“id”?

因为它是串行的,所以您可以使用
从tableName中选择max(id)

     Using max(id) is a very bad idea. It will not give you the correct result 
    in case of multiple concurrent transactions. The only correct way is to use 
curval() or the returning clause.
posgresql
中:已经存在一个BTW

   `INSERT INTO tableName(id, name) VALUES(DEFAULT, 'bob') RETURNING id;`
(还)

获取特定序列:

选择currval(“您的序列的名称”)

从使用的最后一个序列中获取最后一个值:

选择lastval()

手册:

对于PHP mysql用户:

来自php.net

使用SELECT CURRVAL()。通常与pg_get_serial_序列一起使用

JDBC语句。例如,如果表中有一列
id
,其类型为
serial
(可能是PK),但在下面的insert SQL中没有提到,则该列的生成值可以通过以下方式获得:

PreparedStatement s = connection.createStatement
  ("INSERT INTO my_table (c,d) VALUES (1,2)", 
    Statement.RETURN_GENERATED_KEYS);
s.executeUpdate(); 
ResultSet keys = s.getGeneratedKeys();
int id = keys.getInt(1); 

这比稍后发送第二个查询以获取序列值或最大列值要快。另外,根据具体情况,这两个其他解决方案可能不是线程安全的。

从表中选择max(id)?您搜索了吗?上面这篇文章是我第一次搜索“postgresql jdbc生成的密钥”,谢谢@CraigRinger。。事实上,我写的代码是针对大量用户的。。在这种情况下,可能会发生多个插入milisecond@KaushikShrestha查看我的更新答案感谢您的努力,但我不是在php中使用mysql db,而是在hibernate framework(java)中使用Postgres@kaushiksrestha检查我的更新答案使用
max(id)
是一个非常糟糕的主意。在多个并发事务的情况下,它不会给出正确的结果。唯一正确的方法是使用
curval()
returning
子句。但这仅在一次只插入一行时才有用。
PreparedStatement s = connection.createStatement
  ("INSERT INTO my_table (c,d) VALUES (1,2)", 
    Statement.RETURN_GENERATED_KEYS);
s.executeUpdate(); 
ResultSet keys = s.getGeneratedKeys();
int id = keys.getInt(1);