使用第一次插入的结果将记录插入多个表中

时间:2018-06-05 20:36:43

标签: postgresql

对于PostgreSQL而言,我非常原始,并且对SQL Server有一定的经验。这个问题是关于练习的,因为我读了很多东西。

我想插入一条记录(用户),然后取出userID并将更多记录插入更多表中。

传统上,我会使用类似存储过程或触发器来处理它。我已经看到postgreSQL中存在函数(没有存储过程?),但我也发现它们不是事务性的。

我希望我能找到一个具有事务性的解决方案,无论是使用触发器还是存储过程。

目前没有添加外键(将在某些时候存在,而不是在开发的这一点上):

示例(传入$ name,$ password,$ address,$ group_id,$ interestsJson):

insert into user (name, pwd, address) 
values ($name, $password, $address)

insert into user_group (user_id, group_id) 
values (NEW_USER_ID_ABOVE, $group_id)

insert into user_interests (user_id, interests) 
value (NEW_USER_ID_ABOVE, $interestsJson)

1 个答案:

答案 0 :(得分:0)

函数事务性的 - 它们参与调用者的事务。您可以将所有三个插入放在一个函数中并调用它。然而,调用者必须提交事务。

create or replace function do_inserts(p_name text, p_password text, p_address text, p_group_id integer, p_interest jsonb)
as
$$
declare 
  l_user_id integer;
begin 
   insert into "user" (name, pwd, address) 
   values (p_name, p_password, p_address)
   returning id into l_user_id;

   insert into "group" (user_id, group_id) 
   values (l_user_id, p_group_id);

   insert into user_interests (user_id, interests)
   values (l_user_id, p_interests);
end;
$$
language plpgsql;

然后你可以这样做:

begin;
select do_inserts(...);
commit;   

或者,您可以在一个声明中执行所有操作:

with new_user as (
   insert into "user" (name, pwd, address) 
   values (..., ..., ....)
   returning
), new_group as (
   insert into "group" (user_id, group_id) 
   values ((select id from new_user), ...);
)
insert into user_interests (user_id, interests)
values ((select id from new_user), ...);

使用Postgres 11(将于Q4 / 2018发布),您将能够使用存储过程,您可以使用commit