PostgreSQL - 表中的下一个序列值

时间:2013-08-14 13:12:30

标签: postgresql

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

 id   A   B
 1   Jon  Doe
 2   Foo  Bar

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

Tnx很多!

3 个答案:

答案 0 :(得分:30)

如果您想申领一个ID并将其退回,您可以使用nextval()来推进序列而不插入任何数据。

请注意,如果这是SERIAL列,则需要根据表名和列名查找序列名称,如下所示:

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

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

如果你经常在没有实际使用ID的情况下这样做,你最终会用尽32位INSERT列的所有可能值(即达到最大可表示的整数),但是如果你只使用它实际上你很可能会插入一个具有该ID的行,它应该没问题。

答案 1 :(得分:8)

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

SELECT last_value FROM tablename_fieldname_seq;

An SQLfiddle to test with

当然,如果有其他同时进行的插入会话,获取当前值将无法保证您获得的下一个值实际上是last_value + 1 ,因为另一个会话可能已经采取你之前的序列号。

答案 2 :(得分:2)

SELECT currval('names_id_seq') + 1;

请参阅docs

然而,当然,并不能保证它将你的下一个值。如果另一个客户在你之前抓住它会怎么样?您可以为自己保留下一个值之一,从序列中选择nextval