我有一个简单的问题,假设我们有一张表:
id A B
1 Jon Doe
2 Foo Bar
有没有办法知道,这是下一个id的增量,在这种情况下是3? 数据库是PostgreSQL!
Tnx很多!
答案 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;
当然,如果有其他同时进行的插入会话,获取当前值将无法保证您获得的下一个值实际上是last_value + 1
,因为另一个会话可能已经采取你之前的序列号。
答案 2 :(得分:2)
SELECT currval('names_id_seq') + 1;
请参阅docs
然而,当然,并不能保证它将你的下一个值。如果另一个客户在你之前抓住它会怎么样?您可以为自己保留下一个值之一,从序列中选择nextval
。