2010-09-10 37 views
6

序列ID我这样做:选择/显示最后插入在SQL Server的Postgres

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

,所以我得到的查询/标量结果显示

如何将此与Postgres的?

+3

不要在SQL Server中使用'@@ identity'。使用[SCOPE_IDENTITY()](http://msdn.microsoft.com/en-us/library/ms190315.aspx)反而更安全,以避免触发器的潜在问题。 – 2010-09-10 19:30:08

回答

2

这将是

GET DIAGNOSTICS YourParam = RESULT_OID;

请看这里http://www.postgresql.org/docs/8.2/static/plpgsql-statements.html向下滚动到37.6.6。获取结果状态

提问者编辑: 我尝试这样做:

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,你知道什么是错在这里?

+0

是的,我希望它立即显示,相当于选择@@身份 – Omu 2010-09-10 19:34:42

+0

所以转储变量并做SELECT变量 – SQLMenace 2010-09-10 19:35:55

+0

我已经编辑你的答案,你可以看看 – Omu 2010-09-10 19:50:47

22

获取特定的顺序:

SELECT currval('name_of_your_sequence'); 

获取从最后一个序列的最后一个值使用:

SELECT lastval(); 

检查手册,以及:http://www.postgresql.org/docs/current/static/functions-sequence.html

编辑:您还可以使用返回您的INSERT:

INSERT INTO foo(id, name) VALUES(DEFAULT, 'bob') RETURNING id; 
3

一个好方法是使用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 

它适合我!