Как использовать новый серийный идентификатор для каждой новой серии вставленных строк? - PullRequest
2 голосов
/ 10 марта 2020

Можно ли использовать последовательность для пакета строк вместо получения нового идентификатора для каждой вставки? Я отслеживаю набор деталей и хочу, чтобы последовательность применялась для набора, а не для каждой отдельной строки. Так что мои данные должны выглядеть так:

id batch_id name  dept
1    99     John  Engineering
2    99     Amy   Humanities
3    99     Bill  Science
4    99     Jack  English

Это batch_id, который я хочу Postgres выдать как последовательность. Возможно ли это?

1 Ответ

4 голосов
/ 10 марта 2020

Определите 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...