#sql #dynamic-tables #postgresql-13 #table-partitioning
#sql #динамические таблицы #postgresql-13 #разделение таблиц
Вопрос:
Я использую динамически создаваемые разделы таблиц для хранения информации о событиях в базе данных Postgresql 13. Основная таблица, из которой дочерние таблицы вводят свою структуру, содержит поле идентификатора с автоматически увеличивающейся последовательностью. Последовательность, основная таблица и триггер для вставок выглядят следующим образом:
CREATE SEQUENCE event_id_seq
INCREMENT 1
START 1
MINVALUE 1
MAXVALUE 9223372036854775807
CACHE 1;
CREATE TABLE event_master
(
id bigint NOT NULL DEFAULT nextval('event_id_seq'::regclass),
event jsonb,
insert_time as timestamp
)
CREATE TRIGGER insert_event_trigger
BEFORE INSERT
ON event_master
FOR EACH ROW
EXECUTE PROCEDURE event_insert_function();
Кроме event_insert_function()
того, для вставки новых строк, размещенных в главной таблице, используется следующий код:
EXECUTE format('INSERT INTO %I (event, insert_time) VALUES($1,$2)', partition_name) using NEW.event, NEW.insert_time);
При просмотре порядковых номеров в поле id я получаю только все остальные числа, то есть 1,3,5,7, …
Основываясь на некоторой связанной информации, которую я нашел, я предполагаю, что это как-то связано с тем, что Postgresql считает начальную вставку в главную таблицу и инициированную вставку в дочернюю таблицу как два события. Итак, мой первый вопрос заключается в том, правильно ли это, и если да, то в чем рациональность и почему бы не «передать» вставку от ведущего к дочернему элементу?
Что еще более важно, что мне нужно сделать, чтобы правильно настроить последовательность увеличения (т. Е. Возвращать 1,2,3,4 …)?
Комментарии:
1. Почему бы просто не использовать
generated always as identity
столбец?2. @GordonLinoff По какой-то причине это не работает. Идентификатор не создается, и вставка прерывается из-за нарушения ограничения not-null.