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

bprjcwpo  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(308)

这个问题在这里已经有答案了

postgresql multi insert…返回多列(1个答案)
将插入的id插入另一个表(3个答案)
postgresql序列的下一个值(7个答案)
11个月前关门了。
我不懂怎么用 RETURNING ,例如,如何获得下一步的实际值。假设我有两张table:

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');

紧接着,我想用新演员的身份证插入一部电影:

INSERT INTO movies(###);

我怎么用 RETURNING 使用它而不是我的占位符####?

bwitn5fc

bwitn5fc1#

您不需要使用pl/pgsql RETURNING ,这也可以用在普通sql中。
但是对于你所遇到的问题,你两个都不需要,因为你可以使用 currval() 从序列备份 actors.id 获取最后生成的 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,那么可以使用数据修改cte

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;

在线示例

klsxnrf1

klsxnrf12#

您需要在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)

相关问题