2009-07-13 82 views
0

我有一个Postgres的表是这样的:如何使用Postgresql获取自动生成的字段的值?

CREATE SEQUENCE seq; 
CREATE TABLE tbl (id INTEGER DEFAULT VALUE nextval('seq'), data VARCHAR); 

当我插入到表:

INSERT INTO tbl (data) VALUES ('something'); 

我怎样才能找回我刚刚创建的记录id字段的值?

(注意,我可能会得到一些SQL语法有点过的;要点应该清楚,虽然)

假设为参数的缘故,我不是能调用同一CURRVAL因为我不控制事务边界。我可能与我的下一个呼叫在同一个会话中工作,但我可能不会。

回答

1

您正在寻找INSERT ... RETURNING。从The Manual's section on INSERT

可选的RETURNING子句会导致INSERT根据实际插入的每一行计算并返回值。这主要用于获取默认值提供的值,例如序列号。但是,允许使用表格列的任何表达式。 RETURNING列表的语法与SELECT的输出列表的语法相同。

1

在同一会话:

SELECT currval('seq'); 

编辑:但是,如果你不能使用CURRVAL/NEXTVAL,因为你不知道插入和选择序列值将出现在同一个会话中,如果你使用postgresql 8.2或更高版本,你可以像这样编写插入语句。

INSERT INTO tbl (data) VALUES ('something') RETURNING id; 

其中还应返回最后插入的ID。

+0

假设为了说明我正在使用遗留库来隔离每个后续查询在其自己单独的会话中。我是谁。而这只是... eugh。 – 2009-07-13 20:46:14