在PostgreSQL中,如何将最后一个id插入到表中?
在MS SQL中有SCOPE_IDENTITY()。
请不要建议我使用这样的东西:
select max(id) from table
在PostgreSQL中,如何将最后一个id插入到表中?
在MS SQL中有SCOPE_IDENTITY()。
请不要建议我使用这样的东西:
select max(id) from table
当前回答
莱昂布洛伊的回答相当完整。我只会添加一种特殊情况,在这种情况下,需要从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
其他回答
其他答案没有显示如何使用return返回的值。下面是一个将返回值插入到另一个表的示例。
WITH inserted_id AS (
INSERT INTO tbl1 (col1)
VALUES ('foo') RETURNING id
)
INSERT INTO tbl2 (other_id)
VALUES ((select id from inserted_id));
SELECT CURRVAL(pg_get_serial_sequence('my_tbl_name','id_col_name'))
当然,您需要提供表名和列名。
这将用于当前会话/连接 http://www.postgresql.org/docs/8.3/static/functions-sequence.html
请参阅下面的示例
CREATE TABLE users (
-- make the "id" column a primary key; this also creates
-- a UNIQUE constraint and a b+-tree index on the column
id SERIAL PRIMARY KEY,
name TEXT,
age INT4
);
INSERT INTO users (name, age) VALUES ('Mozart', 20);
然后,要获取最后插入的id,请使用下面的语句对user表执行seq列名为id
SELECT currval(pg_get_serial_sequence('users', 'id'));
对于需要获取所有数据记录的用户,可以添加
returning *
到查询的末尾以获取包括id在内的所有对象。
莱昂布洛伊的回答相当完整。我只会添加一种特殊情况,在这种情况下,需要从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