Вставка записей в несколько таблиц с использованием результатов первой вставки - PullRequest
0 голосов
/ 05 июня 2018

Я довольно груб, когда дело доходит до PostgreSQL и имею некоторый опыт работы с SQL Server.Этот вопрос касается практики, потому что я прочитал много вещей.

Я хочу вставить запись (пользователя), а затем взять это userID и вставить еще пару записей в еще пару таблиц.

Традиционно я бы использовал что-то вроде хранимой процедуры или триггера для обработки этого.Я видел, что функции существуют в postgreSQL (нет хранимой процедуры?), Но я также видел, что они не транзакционные.

Я надеюсь, что смогу найти решение, которое является транзакционным, либо с триггером, либо с сохранениемпроцедура.

Внешние ключи в настоящее время не добавляются (будут существовать в какой-то момент, но не на данном этапе разработки):

Пример (передача $ name, $ password, $ address, $ $идентификатор_группы, $ интересовJson):

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 голосов
/ 05 июня 2018

Функции являются транзакционными - они участвуют в транзакции звонящего.Вы можете поместить все три вставки в одну функцию и вызвать ее.Однако вызывающий объект должен совершить транзакцию.

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), ...);

С Postgres11 (будет выпущен в Q4 / 2018), вы сможете использовать хранимые процедуры, где вы можете использовать commit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...