PostgreSQL - 表中的下一个序列值

Adr*_*ian 19 postgresql

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

 id   A   B
 1   Jon  Doe
 2   Foo  Bar
Run Code Online (Sandbox Code Playgroud)

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

Tnx很多!

IMS*_*SoP 38

如果要声明ID并将其返回,则可以使用nextval(),这会使序列前进而不插入任何数据.

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

Select nextval(pg_get_serial_sequence('my_table', 'id')) as new_id;
Run Code Online (Sandbox Code Playgroud)

没有铸铁保证您会看到这些ID按顺序返回(序列按顺序生成它们,但是多个会话可以声明ID而不使用它,或者回滚INSERT并且ID不会被重复使用但是可以保证它们是独一无二的,这通常是重要的.

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


Joa*_*son 8

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

SELECT last_value FROM tablename_fieldname_seq;
Run Code Online (Sandbox Code Playgroud)

一个要测试的SQLfiddle.

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

  • 请注意,建议不要依赖为"SERIAL"列生成的序列的命名,因为这被视为实现细节,可能会发生变化.[`pg_get_serial_sequence()`](http://www.postgresql.org/docs/current/static/functions-info.html)函数将为您提供特定列"拥有"序列的名称. (3认同)

Joe*_*ler 6

我是新手,所以这是我使用的过程,对 Postgres/SQL 的工作原理知之甚少,甚至一无所知:

  1. 使用pg_get_serial_sequence()查找表的序列

    SELECT pg_get_serial_sequence('person','id');
    
    Run Code Online (Sandbox Code Playgroud)

    这应该输出类似的内容public.person_id_seqperson_id_seq是您的表的顺序。


  1. 将 (1) 中的序列插入nextval()

    SELECT nextval('person_id_seq');
    
    Run Code Online (Sandbox Code Playgroud)

    这将输出一个整数值,该值将是添加到表中的下一个 id。


  1. 您可以将其变成单个命令,如上面接受的答案中所述

    SELECT nextval(pg_get_serial_sequence('person','id'));
    
    Run Code Online (Sandbox Code Playgroud)

  1. 如果您发现序列返回意外值,您可以使用setval()设置序列的当前值

    SELECT setval(pg_get_serial_sequence('person','id'),1000);
    
    Run Code Online (Sandbox Code Playgroud)

    在此示例中,下一次调用 nextval() 将返回 1001。