对于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)
答案 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