如何在插入行后获取序列ID?

时间:2013-06-03 12:43:02

标签: java hibernate postgresql

我有一张带有行' id' (主键)默认设置为PostgreSQL中的串行。我通过调用

插入此行
session.getCurrentSession().createSQLQuery("some insert query") 

不向id添加任何值,因为它默认设置为serial。

如何检索`id'刚插入的行?

3 个答案:

答案 0 :(得分:4)

JDBC语句can return the generated keys。例如,如果表具有类型id的单个列serial(可能是PK),下面的插入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); 

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

答案 1 :(得分:1)

由于它是连续的,您可以使用select max(id) from tableName

     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中:已存在stackoverflow-question BTW。

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

(也)

获取特定序列:

SELECT currval('name_of_your_sequence');

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

SELECT lastval();

手动:http://www.postgresql.org/docs/current/static/functions-sequence.html

对于PHP-mysql用户:

来自php.net clickhere

<?php
$link = mysqli_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
    die('Could not connect: ' . mysqli::$connect_error() );
}
mysqli::select_db('mydb');

mysqli::query("INSERT INTO mytable (product) values ('kossu')");
printf("Last inserted record has id %d\n", mysqli::$insert_id());
?>

但是你需要连接每个查询。

答案 2 :(得分:0)

使用SELECT CURRVAL(); 。通常与pg_get_serial_sequence

一起使用

postgreSQL function for last inserted ID