with rows as (
INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id
)
INSERT INTO Table2 (val)
SELECT id
FROM rows
同时,如果你只对id感兴趣,你可以通过一个触发器来实现:
create function t1_ins_into_t2()
returns trigger
as $$
begin
insert into table2 (val) values (new.id);
return new;
end;
$$ language plpgsql;
create trigger t1_ins_into_t2
after insert on table1
for each row
execute procedure t1_ins_into_t2();
DO $$
DECLARE tableId integer;
BEGIN
INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id INTO tableId;
INSERT INTO Table2 (val) VALUES (tableId);
END $$;
with rows as (
INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id
)
INSERT INTO Table2 (val, val2, val3)
SELECT id, 'val2value', 'val3value'
FROM rows
RETURNING val
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (lastval());
只要没有人在INSERT之间的任何其他序列(在当前会话中)上调用nextval(),这就可以正常工作。 正如下面提到的Denis和我在上面警告过的,如果在INSERT之间使用nextval()访问另一个序列,使用lastval()会给您带来麻烦。如果Table1上有一个INSERT触发器手动调用序列上的nextval(),或者更有可能的是,我在一个主键为SERIAL或BIGSERIAL的表上执行了INSERT操作,如果你真的很多疑(这是一件好事,毕竟 they 真的是你),那么你可以使用currval(),但是你需要知道相关序列的名称:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (currval('Table1_id_seq'::regclass));
6条答案
按热度按时间rjzwgtxy1#
您可以从Postgres 9.1开始执行此操作:
同时,如果你只对id感兴趣,你可以通过一个触发器来实现:
pod7payv2#
这种情况下的最佳做法是使用
RETURNING … INTO
。请注意,这是针对PLPGSQL的
4si2a6ki3#
使用psql(10.3,服务器9.6.8)进行测试
wkftcu5l4#
与丹尼斯·德·贝尔纳迪给出的答案一致。
如果你想在之后返回id,并且想在Table2中插入更多的内容:
de90aj5v5#
您可以使用
lastval()
函数:返回最近使用
nextval
为任何序列获取的值比如说
只要没有人在INSERT之间的任何其他序列(在当前会话中)上调用
nextval()
,这就可以正常工作。正如下面提到的Denis和我在上面警告过的,如果在INSERT之间使用
nextval()
访问另一个序列,使用lastval()
会给您带来麻烦。如果Table1
上有一个INSERT触发器手动调用序列上的nextval()
,或者更有可能的是,我在一个主键为SERIAL
或BIGSERIAL
的表上执行了INSERT操作,如果你真的很多疑(这是一件好事,毕竟 they 真的是你),那么你可以使用currval()
,但是你需要知道相关序列的名称:自动生成的序列通常命名为
t_c_seq
,其中t
是表名,c
是列名,但您始终可以通过进入psql
并输入以下命令来查找:然后查看相关列的默认值,例如:
FYI:
lastval()
或多或少是MySQL的LAST_INSERT_ID
的PostgreSQL版本。我之所以提到这一点,是因为很多人对MySQL比对PostgreSQL更熟悉,所以将lastval()
链接到熟悉的东西可能会澄清一些事情。ippsafx76#
表格_ex
ID默认值下一个值('表ID序列'::regclass),
1号营地瓦尔查尔
2号营地瓦尔查尔