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)
如果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)
此函数
currval与之相同,不同之处在于它不是将序列名称作为参数,而是取取nextval当前会话中使用的最后一个序列的值.
如果你有(或可以)多个序列链接到表(即使通过触发器或其他副作用),肯定的方法是使用currval('tbl_tbl_id_seq').
我的示例中的字符串文字 'tbl_tbl_id_seq'应该是序列的实际名称并且被强制转换为regclass,如果在当前没有找到该名称的序列,则会引发异常search_path.
tbl_tbl_id_seq是tbl具有串行列的表的自动生成的默认值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)
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)
如果您知道序列的名称,则可以使用pg_sequence_last_value() :
SELECT pg_sequence_last_value('public.person_id_seq');
Run Code Online (Sandbox Code Playgroud)
我偶然发现了这个问题 b/c 我试图通过表格找到下一个序列值。这没有回答我的问题,但是这是如何完成的,它可以帮助那些不是按名称而是按表查找序列值的人:
SELECT nextval(pg_get_serial_sequence('<your_table>', 'id')) AS new_id;
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你 :)
| 归档时间: |
|
| 查看次数: |
93717 次 |
| 最近记录: |