我有一个简单的问题,假设我们有一张桌子:
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的行应该没问题.
要获取序列的当前值而不影响它或在同一会话中需要先前的插入,您可以使用;
SELECT last_value FROM tablename_fieldname_seq;
Run Code Online (Sandbox Code Playgroud)
当然,获取当前值并不能保证您实际获得的下一个值last_value + 1是否存在其他同时进行插入的会话,因为另一个会话可能在您之前获取了序列值.
我是新手,所以这是我使用的过程,对 Postgres/SQL 的工作原理知之甚少,甚至一无所知:
使用pg_get_serial_sequence()查找表的序列
SELECT pg_get_serial_sequence('person','id');
Run Code Online (Sandbox Code Playgroud)
这应该输出类似的内容public.person_id_seq。person_id_seq是您的表的顺序。
将 (1) 中的序列插入nextval()
SELECT nextval('person_id_seq');
Run Code Online (Sandbox Code Playgroud)
这将输出一个整数值,该值将是添加到表中的下一个 id。
您可以将其变成单个命令,如上面接受的答案中所述
SELECT nextval(pg_get_serial_sequence('person','id'));
Run Code Online (Sandbox Code Playgroud)
如果您发现序列返回意外值,您可以使用setval()设置序列的当前值
SELECT setval(pg_get_serial_sequence('person','id'),1000);
Run Code Online (Sandbox Code Playgroud)
在此示例中,下一次调用 nextval() 将返回 1001。
| 归档时间: |
|
| 查看次数: |
19284 次 |
| 最近记录: |