postgresql 我可以在另一个INSERT中使用INSERT...RETURNING的返回值吗?

tcomlyy6  于 2023-03-12  发布在  PostgreSQL
关注(0)|答案(6)|浏览(203)

这可能吗?

INSERT INTO Table2 (val)
VALUES ((INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id));

比如使用返回值作为在第二个表中插入一行并引用第一个表的值?

rjzwgtxy

rjzwgtxy1#

您可以从Postgres 9.1开始执行此操作:

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();
pod7payv

pod7payv2#

这种情况下的最佳做法是使用RETURNING … INTO

INSERT INTO teams VALUES (...) RETURNING id INTO last_id;

请注意,这是针对PLPGSQL的

4si2a6ki

4si2a6ki3#

DO $$
DECLARE tableId integer;
BEGIN
  INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id INTO tableId;
  INSERT INTO Table2 (val) VALUES (tableId);
END $$;

使用psql(10.3,服务器9.6.8)进行测试

wkftcu5l

wkftcu5l4#

与丹尼斯·德·贝尔纳迪给出的答案一致。
如果你想在之后返回id,并且想在Table2中插入更多的内容:

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
de90aj5v

de90aj5v5#

您可以使用lastval()函数:
返回最近使用nextval为任何序列获取的值
比如说

INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val)  VALUES (lastval());

只要没有人在INSERT之间的任何其他序列(在当前会话中)上调用nextval(),这就可以正常工作。
正如下面提到的Denis和我在上面警告过的,如果在INSERT之间使用nextval()访问另一个序列,使用lastval()会给您带来麻烦。如果Table1上有一个INSERT触发器手动调用序列上的nextval(),或者更有可能的是,我在一个主键为SERIALBIGSERIAL的表上执行了INSERT操作,如果你真的很多疑(这是一件好事,毕竟 they 真的是你),那么你可以使用currval(),但是你需要知道相关序列的名称:

INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val)  VALUES (currval('Table1_id_seq'::regclass));

自动生成的序列通常命名为t_c_seq,其中t是表名,c是列名,但您始终可以通过进入psql并输入以下命令来查找:

=> \d table_name;

然后查看相关列的默认值,例如:

id | integer | not null default nextval('people_id_seq'::regclass)

FYI:lastval()或多或少是MySQL的LAST_INSERT_ID的PostgreSQL版本。我之所以提到这一点,是因为很多人对MySQL比对PostgreSQL更熟悉,所以将lastval()链接到熟悉的东西可能会澄清一些事情。

ippsafx7

ippsafx76#

表格_ex
ID默认值下一个值('表ID序列'::regclass),
1号营地瓦尔查尔
2号营地瓦尔查尔

INSERT INTO table_ex(camp1,camp2) VALUES ('xxx','123') RETURNING id

相关问题