Sql 如何使用RETURNING子句插入到两个表中?

Sql 如何使用RETURNING子句插入到两个表中?,sql,postgresql,sql-returning,Sql,Postgresql,Sql Returning,我不知道如何使用返回,例如,如何在下一步“掌握”实际值。假设我有两个表: create table "actors" ( id_act serial not null primary key, first_name text not null, last_name text not null ); create table movies ( id_mov serial not null primary key, act_id integer not null ); 现在我添

我不知道如何使用
返回
,例如,如何在下一步“掌握”实际值。假设我有两个表:

create table "actors" (
  id_act serial not null primary key,
  first_name text not null,
  last_name text not null
);
create table movies (
  id_mov serial not null primary key,
  act_id integer not null
);
现在我添加一个演员:

INSERT INTO actors (first_name, last_name) VALUES ('Tom', 'Hanks');
紧接着,我想用新演员的ID插入一部电影:

INSERT INTO movies(###);

如何使用
RETURNING
来使用它而不是占位符####?

您需要在INSERT语句中使用RETURNING子句将返回的值存储在另一个变量中

例如:

create or replace procedure insert_rows()
language plpgsql
as
$$
declare
 v_id_act int;
begin
INSERT INTO actors (first_name, last_name) VALUES ('Tom', 'Hanks') RETURNING id_act INTO v_id_act;
INSERT INTO movies(act_id) values (v_id_act);
end;
$$;
CREATE PROCEDURE

call insert_rows();
CALL

select * from actors;
 id_act | first_name | last_name 
--------+------------+-----------
      1 | Tom        | Hanks
(1 row)

select * from movies;
 id_mov | act_id 
--------+--------
      1 |      1
(1 row)

您不需要PL/pgSQL来使用
返回
,这也可以在普通SQL中使用

但是对于您遇到的问题,您不需要任何一个,因为您可以使用序列backing
actors.id
中的
currval()
来获取最后生成的
id

INSERT INTO actors (first_name, last_name) VALUES ('Tom', 'Hanks');
INSERT INTO movies(act_id) values 
(currval(pg_get_serial_sequence('actors', 'act_id')));
如果您确实想使用RETURNING,可以使用


谢谢,但是。。。我发布了上述创建、声明v_id_act int;将返回id的值('Tom','Hanks')插入到演员(名字,姓氏)中,并将id插入到v_id_act中;这导致了一个SQL错误[42601]:错误:语法错误在或接近“INTO”我已经用
psql
显示了语句执行的输出:您只需要运行
create或replace…$(11行)。我不明白你怎么会有语法错误。您使用哪个工具来运行这些语句?我使用了dBeaver。我不想要这个程序;在这里[link]()我找到了一个描述,请参阅最后一章“获取最后一个插入id”:我现在想要的是在我手中获取该值“8”,以便进一步存储和使用。您的主机编程语言是什么?也许可以使用主机变量进行检索,但我不确定。如果这是您真正想要做的,请提出一个新问题,详细说明此特定需求,并将主机语言添加为问号。谢谢,但是。。。我发布了五次INSERT-INTO-actors(名字,姓氏)值('Tom','Hanks');id_act now=5之后,我发布了INSERT-INTO-movies(act_id)值(lastval());并假设将5视为act_id,但它始终是电影的最高id,而不是Actorthe的最新id。。版本生成SQL错误:返回id;在或接近“@StOMicha:我有一个错误的
在CTE内部。你是对的,
lastval()。见我的编辑非常感谢,新的。。。看起来不错,有没有办法将该ID放入一个变量以供其他用途?
with new_actor as (
  INSERT INTO actors (first_name, last_name) VALUES ('Tom', 'Hanks')
  returning id_act
)
insert into movies (act_id)
select id_Act
from new_actor;