Определите batch_id как batch_id bigint not null default currval('seqname')
и вызовите nextval('seqname')
вручную перед вставкой пакета строк.
Или, для полной автоматизации:
1) Создайте последовательность для идентификатора партии:
create sequence mytable_batch_id;
2) Создайте свою таблицу, объявите поле идентификатора партии, как показано ниже:
create table mytable (
id bigserial not null primary key,
batch_id bigint not null default currval('mytable_batch_id'),
name text not null);
3) Создайте триггер уровня оператора для увеличения последовательности идентификатора пакета:
create function tgf_mytable_batch_id() returns trigger language plpgsql
as $$
begin
perform nextval('mytable_batch_id');
return null;
end $$;
create trigger tg_mytablebatch_id
before insert on mytable
for each statement execute procedure tgf_mytable_batch_id();
Теперь каждый отдельный оператор при вставке данных в таблицу будет интерпретироваться как следующий отдельный пакет.
Пример:
postgres=# insert into mytable (name) values('John'), ('Amy'), ('Bill');
INSERT 0 3
postgres=# insert into mytable (name) values('Jack');
INSERT 0 1
postgres=# insert into mytable (name) values('Jimmmy'), ('Abigail');
INSERT 0 2
postgres=# table mytable;
id | batch_id | name
----+----------+-------------
1 | 1 | John
2 | 1 | Amy
3 | 1 | Bill
4 | 2 | Jack
5 | 3 | Jimmy
6 | 3 | Abigail
(6 rows)