在Postgres中选择/显示最后插入的序列ID

7

在 SQL Server 中,我会这样做:

insert into foo(name) values('bob')
select @@identity;

我想知道如何使用PostgreSQL来获取查询/标量结果的显示。


3
在SQL Server中不要使用@@identity,而是使用SCOPE_IDENTITY()更为安全,可以避免触发器带来的潜在问题。 - Joe Stefanelli
3个回答

27

4
一个好的方法是使用 RETURNING id。以下是一个使用 PL/pgSQL 的简短示例:
        DECLARE
        nivel1 RECORD;
        resultId BIGINT;
        BEGIN
          FOR nivel1 IN SELECT * FROM primary_table LOOP
            INSERT INTO second_table(id, field2, field3) VALUES (DEFAULT, "value2", "value3") RETURNING id INTO resultId;
            RAISE NOTICE 'Inserted id: %s', quote_literal(resultId);
          END LOOP;
        RETURN;
        END

这对我来说可行!


2

希望您能够执行以下操作:

GET DIAGNOSTICS YourParam = RESULT_OID;

请查看此链接:http://www.postgresql.org/docs/8.2/static/plpgsql-statements.html 并向下滚动至37.6.6.获取结果状态。

asker edit: 我尝试了这个方法:

create or replace function aaa() returns int as $$ 
declare 
a int;
begin
insert into oameni values(default, 'aaa');
get diagnostics a = result_oid;
return a;
end;
$$ language plpgsql;

它总是返回0,你知道这里出了什么问题吗?


是的,我希望它立即显示出来,相当于选择@@identity。 - Omu
将数据转储到变量中,然后执行SELECT语句。 - SQLMenace
1
RESULT_OID不返回SERIAL列的值,它返回记录的内部OID(如果存在)。有两点需要注意:(1)OID永远不应该被用作记录ID,它仅供内部使用;(2)在后续版本的PostgreSQL中,默认情况下关闭了表的OID。这很可能解释了您从链接文档中获得的零返回值:“RESULT_OID仅在插入到包含OID的表中的INSERT命令之后有用”。获取结果值的正确方法是使用RETURNING子句。 - Matthew Wood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接