在PostgreSQL中,如何将最后一个id插入到表中?

在MS SQL中有SCOPE_IDENTITY()。

请不要建议我使用这样的东西:

select max(id) from table

当前回答

试试这个:

select nextval('my_seq_name');  // Returns next value

如果这个返回1(或者你的序列的start_value),那么将序列重置回原始值,传递false标志:

select setval('my_seq_name', 1, false);

否则,

select setval('my_seq_name', nextValue - 1, true);

这将把序列值恢复到原始状态,“setval”将返回您正在寻找的序列值。

其他回答

莱昂布洛伊的回答相当完整。我只会添加一种特殊情况,在这种情况下,需要从PL/pgSQL函数中获得最后插入的值,而OPTION 3并不完全适合。

例如,如果我们有以下表格:

CREATE TABLE person(
   id serial,
   lastname character varying (50),
   firstname character varying (50),
   CONSTRAINT person_pk PRIMARY KEY (id)
);

CREATE TABLE client (
    id integer,
   CONSTRAINT client_pk PRIMARY KEY (id),
   CONSTRAINT fk_client_person FOREIGN KEY (id)
       REFERENCES person (id) MATCH SIMPLE
);

如果我们需要插入客户记录,我们必须引用人员记录。但是,假设我们想要设计一个PL/pgSQL函数,它将插入一个新记录到客户端,但同时也负责插入新的人员记录。为此,我们必须使用leonbloy的选项3的轻微变化:

INSERT INTO person(lastname, firstname) 
VALUES (lastn, firstn) 
RETURNING id INTO [new_variable];

注意这里有两个INTO子句。因此,PL/pgSQL函数的定义如下:

CREATE OR REPLACE FUNCTION new_client(lastn character varying, firstn character varying)
  RETURNS integer AS
$BODY$
DECLARE
   v_id integer;
BEGIN
   -- Inserts the new person record and retrieves the last inserted id
   INSERT INTO person(lastname, firstname)
   VALUES (lastn, firstn)
   RETURNING id INTO v_id;

   -- Inserts the new client and references the inserted person
   INSERT INTO client(id) VALUES (v_id);

   -- Return the new id so we can use it in a select clause or return the new id into the user application
    RETURN v_id;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE;

现在我们可以使用以下命令插入新数据:

SELECT new_client('Smith', 'John');

or

SELECT * FROM new_client('Smith', 'John');

我们得到了新创建的id。

new_client
integer
----------
         1

试试这个:

select nextval('my_seq_name');  // Returns next value

如果这个返回1(或者你的序列的start_value),那么将序列重置回原始值,传递false标志:

select setval('my_seq_name', 1, false);

否则,

select setval('my_seq_name', nextValue - 1, true);

这将把序列值恢复到原始状态,“setval”将返回您正在寻找的序列值。

其他答案没有显示如何使用return返回的值。下面是一个将返回值插入到另一个表的示例。

WITH inserted_id AS (
  INSERT INTO tbl1 (col1)
  VALUES ('foo') RETURNING id
)

INSERT INTO tbl2 (other_id) 
VALUES ((select id from inserted_id));

Postgres有一个内置的机制,可以在同一个查询中返回id或任何您希望查询返回的内容。 这里有一个例子。假设您创建了一个有两列columnn1和column2的表,并且希望在每次插入后返回columnn1。

# create table users_table(id serial not null primary key, name character varying);
CREATE TABLE
#insert into users_table(name) VALUES ('Jon Snow') RETURNING id;
 id 
----
  1
(1 row)

# insert into users_table(name) VALUES ('Arya Stark') RETURNING id;
 id 
----
  2
(1 row)
SELECT CURRVAL(pg_get_serial_sequence('my_tbl_name','id_col_name'))

当然,您需要提供表名和列名。

这将用于当前会话/连接 http://www.postgresql.org/docs/8.3/static/functions-sequence.html