PostgreSQL下一个序列的值?

i_n*_*mad 30 postgresql codeigniter sequence nextval postgresql-9.1

我在我的Codeigniter网站上使用PostgreSQL.我正在使用杂货店crud来添加,编辑和删除操作.在进行编辑或添加时,我想根据内容的ID动态重命名上传的文件.我可以使用杂货crud的callback_after_upload功能来做到这一点.

在添加新内容时,我想要内容的下一个ID.我尝试使用nextval()函数,但序列随之增加.如何在不使用nextval()函数的情况下获取序列的最后一个值?

或者有一种简单的方法可以做到这一点吗?

Erw*_*ter 38

RETURNING

在现代的PostgreSQL(8.2或更高版本)中,您可以通过一次往返数据库的方式完成此操作:

INSERT INTO tbl(filename)
VALUES ('my_filename')
RETURNING tbl_id;
Run Code Online (Sandbox Code Playgroud)

tbl_id是一个serial专栏.更多内容在手册中.

显式获取值

如果filename需要包含tbl_id(冗余),您仍然可以使用单个查询.
使用lastval()或更具体currval():

INSERT INTO tbl (filename)
VALUES ('my_filename' || lastval())  -- or currval('tbl_tbl_id_seq')
RETURNING tbl_id;
Run Code Online (Sandbox Code Playgroud)

手册关于lastval():

此函数currval与之相同,不同之处在于它不是将序列名称作为参数,而是取取nextval当前会话中使用的最后一个序列的值.

如果你有(或可以)多个序列链接到表(即使通过触发器或其他副作用),肯定的方法是使用currval('tbl_tbl_id_seq').

序列名称

我的示例中的字符串文字 'tbl_tbl_id_seq'应该是序列的实际名称并且被强制转换为regclass,如果在当前没有找到该名称的序列,则会引发异常search_path.

tbl_tbl_id_seqtbl具有串行列的表的自动生成的默认值tbl_id.但是没有保证.如果已定义,列默认值可以从任何序列中获取值.如果在创建表时采用默认名称,Postgres会根据硬编码算法选择下一个免费名称.

如果您不知道serial列的序列名称,请使用专用函数进行查找pg_get_serial_sequence().甚至可以在飞行中完成:

INSERT INTO tbl (filename)
VALUES ('my_filename' || currval(pg_get_serial_sequence('tbl', 'tbl_id'))
RETURNING tbl_id;
Run Code Online (Sandbox Code Playgroud)

SQL小提琴.


a_h*_*ame 18

使用该currval()函数访问先前获得的序列值.

但是如果之前nextval()调用,那将只返回一个值.

在没有实际获得它的情况下,绝对没有办法在序列的下一个值上"窥视".

但你的问题还不清楚.如果nextval()在执行插入之前调用,则可以在插入中使用该值.或者甚至更好,currval()在insert语句中使用:

select nextval('my_sequence') ...

... do some stuff with the obtained value

insert into my_table(id, filename)
values (currval('my_sequence'), 'some_valid_filename');
Run Code Online (Sandbox Code Playgroud)

  • @i_nomad:这个杂货店突然来自哪里?您询问了有关在PostgreSQL中使用序列的问题. (4认同)

Joe*_*ler 8

2022年的答案

如果您知道序列的名称,则可以使用pg_sequence_last_value() :

SELECT pg_sequence_last_value('public.person_id_seq');
Run Code Online (Sandbox Code Playgroud)


rad*_*tek 6

我偶然发现了这个问题 b/c 我试图通过表格找到下一个序列值。这没有回答我的问题,但是这是如何完成的,它可以帮助那些不是按名称而是按表查找序列值的人:

SELECT nextval(pg_get_serial_sequence('<your_table>', 'id')) AS new_id; 
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 :)


小智 5

如果您不在会话中,您只需 nextval('you_sequence_name') 就可以了。