-1

我有一个表,其中行“id”(主键)默认设置为 PostgreSQL 中的串行。我通过调用插入这一行

session.getCurrentSession().createSQLQuery("some insert query") 

没有在 id 中添加任何值,因为它默认设置为串行。

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

4

3 回答 3

5

JDBC 语句可以返回生成的键。例如,如果表有一个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); 

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

于 2013-06-03T19:57:47.983 回答
2

由于它是串行的,您可以使用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问题存在顺便说一句。

   `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点击这里

<?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());
?>

但是您需要为每个查询连接。

于 2013-06-03T12:46:35.973 回答
0

使用 SELECT CURRVAL(); . 通常与 pg_get_serial_sequence 结合使用

最后插入的 ID 的 postgreSQL 函数

于 2013-06-03T12:47:51.843 回答