免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4578 | 回复: 4
打印 上一主题 下一主题

请教通过PLpgSQL如何获得上次插入的id [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-23 14:45 |只看该作者 |倒序浏览
5可用积分
#table abc
create table abc(id serial, name varchar);

CREATE OR REPLACE FUNCTION "abc_insert" (author varchar) RETURNS integer AS
$body$
declare
id_seq integer;
begin
insert into abc (name) values (author);
-- 需要返回 刚插入id(serial 类型)的应该如何写?
return id_seq;
end;
$body$
LANGUAGE 'plpgsql'

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
2 [报告]
发表于 2011-12-23 23:32 |只看该作者
  1. CREATE OR REPLACE FUNCTION abc_insert(author character varying)
  2.   RETURNS integer AS
  3. $BODY$
  4. declare
  5. id_seq integer;
  6. begin
  7. insert into abc (name) values (author);
  8. -- 需要返回 刚插入id(serial 类型)的应该如何写?
  9. select currval('abc_id_seq') INTO id_seq;
  10. return id_seq;
  11. end;
  12. $BODY$
  13.   LANGUAGE plpgsql VOLATILE
  14.   COST 100;
  15. ALTER FUNCTION abc_insert(character varying)
  16.   OWNER TO postgres;
复制代码

postgresql 取下一个自动插入的序列号值 2011-07-09 23:05:05
标签:postgresql 自动插入 序列号值
以下方式只适用于SERIAL类型的字段
注意自动创建的 SEQUENCE 对象的名称将会是 <table>_<serialcolumn>_seq, 这里 table 和 serialcolumn 分别是你的表的名称和你的 SERIAL 字段的名称。
一种方法是在插入之前先用函数 nextval() 从序列对象里检索出下一个 SERIAL 值,然后再显式插入。
SELECT nextval('person_id_seq')
相反,在 SERIAL 对象缺省插入后你可以用函数 currval() 检索刚赋值的 SERIAL 值例如:
SELECT currval('person_id_seq')
使用 currval() 不会导致和其他用户的冲突情况,因为currval() 返回的是你本次会话进程所赋的值而不是所有用户的当前值。

http://icedragon.blog.51cto.com/292088/607343

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
3 [报告]
发表于 2011-12-23 23:34 |只看该作者
在你的注释下添加了一句
  1. select currval('abc_id_seq') INTO id_seq;
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-01-30 10:45 |只看该作者
好方法。学习了。

论坛徽章:
0
5 [报告]
发表于 2012-03-14 10:50 |只看该作者
好方法!

论坛徽章:
0
6 [报告]
发表于 2012-03-19 22:34 |只看该作者
不错.更具序列获得id

论坛徽章:
0
7 [报告]
发表于 2012-04-02 18:11 |只看该作者
本帖最后由 hmily36 于 2012-04-02 18:12 编辑

用SQL来实现:
  1. INSERT INTO abc (name) VALUES (author) RETURNING col
复制代码
col为你希望返回的字段名,这儿就是id 。 这也是最标准获得insert_id的方式,mysql那种 $dbh->insert_id()的方式极其不严谨,容易出问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP