39

我有一个简单的问题,假设我们有一张桌子:

 id   A   B
 1   Jon  Doe
 2   Foo  Bar

有没有办法知道下一个 id 的增量,在这种情况下是 3 ?数据库是 PostgreSQL!

很多!

4

3 回答 3

72

如果您想声明一个 ID 并返回它,您可以使用nextval(),它会在不插入任何数据的情况下推进序列。

注意,如果这是一个SERIAL列,则需要根据表和列名找到序列的名称,如下:

Select nextval(pg_get_serial_sequence('my_table', 'id')) as new_id;

无法保证您会看到这些 ID 按顺序返回(序列按顺序生成它们,但是多个会话可以声明一个 ID 并且尚未使用它,或者回滚一个INSERT并且该 ID 不会被重用) 但可以保证它们是唯一的,这通常是重要的。

如果您经常这样做而不实际使用 ID,您最终将用完 32 位列的所有可能值integer(即达到最大可表示整数),但如果您仅在很有可能实际使用它时使用它插入具有该 ID 的行应该没问题。

于 2013-08-14T13:27:55.613 回答
14

要获取序列的当前值而不影响它或需要在同一会话中进行先前的插入,您可以使用;

SELECT last_value FROM tablename_fieldname_seq;

一个用于测试的 SQLfiddle

当然,获取当前值并不能保证您将获得的下一个值实际上是last_value + 1是否有其他同时执行插入的会话,因为另一个会话可能在您之前获取了序列值。

于 2013-08-14T13:27:44.630 回答
3

SELECT currval('names_id_seq') + 1;

查看文档

但是,当然,不能保证它会成为您的下一个价值。如果另一个客户抢在你之前怎么办?您可以为自己保留下一个值,nextval从序列中选择一个。

于 2013-08-14T13:15:39.627 回答