PostgreSQL:帮助我了解RETURNING

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PostgreSQL:帮助我了解RETURNING相关的知识,希望对你有一定的参考价值。

[抱歉,我不知道如何使用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
);

现在我添加一个演员:

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即可使用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,则可以使用data modifying 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;

Online example

以上是关于PostgreSQL:帮助我了解RETURNING的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL RETURNING 失败并出现 REGEXP_REPLACE

PostgreSql INSERT FROM SELECT RETURNING ID

如何在 PostgreSQL 中使用 RETURNING 和 ON CONFLICT?

postgresql update returning

Postgresql INSERT RETURNING 复杂类型

PostgreSQL v12.6 中的 PLpgSQL INSERT-RETURNING-INTO 错误?