PosgreSQL вставка в две таблицы за одну транзакцию

Есть две таблицы. Нужно вставить данные в обе за одну транзакцию. Планирую использовать конструкцию "BEGIN;...;COMMIT;" Есть одна сложность - в поле второй таблицы нужно добавить id из первой таблицы, который генерируется автоматически. Как это сделать?


Ответы (1 шт):

Автор решения: Alexander Pavlov

Если ключ генерируется автоматически, то

create table t1 (id serial primary key, s varchar );
create table t2 (ref_id int, s varchar );

with i as (
    insert into t1(s) values ('text') returning id
)
insert into t2 (ref_id, s) select i.id, 'another text' from i;

А если ключ генерируется с помощью sequence, то

create sequence my_sequence;
create table t1 (id int primary key, s varchar );
create table t2 (ref_id int, s varchar );
insert into t1(id, s) values (nextval('my_sequence'), 'text');
insert into t2(ref_id, s) values (currval('my_sequence'), 'another text');

Впрочем, первый подход работает и с sequence тоже, да и вообще более гибкий, потому что позволяет протаскивать сколько угодно полей

→ Ссылка